//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_spi(SotoInternal) import SotoCore

extension Lightsail {
    // MARK: Enums

    public enum AccessDirection: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case inbound = "inbound"
        case outbound = "outbound"
        public var description: String { return self.rawValue }
    }

    public enum AccessType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case `private` = "private"
        case `public` = "public"
        public var description: String { return self.rawValue }
    }

    public enum AccountLevelBpaSyncStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case defaulted = "Defaulted"
        case failed = "Failed"
        case inSync = "InSync"
        case neverSynced = "NeverSynced"
        public var description: String { return self.rawValue }
    }

    public enum AddOnType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case autoSnapshot = "AutoSnapshot"
        case stopInstanceOnIdle = "StopInstanceOnIdle"
        public var description: String { return self.rawValue }
    }

    public enum AlarmState: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case alarm = "ALARM"
        case insufficientData = "INSUFFICIENT_DATA"
        case ok = "OK"
        public var description: String { return self.rawValue }
    }

    public enum AppCategory: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case lfR = "LfR"
        public var description: String { return self.rawValue }
    }

    public enum AutoMountStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case failed = "Failed"
        case mounted = "Mounted"
        case notMounted = "NotMounted"
        case pending = "Pending"
        public var description: String { return self.rawValue }
    }

    public enum AutoSnapshotStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case failed = "Failed"
        case inProgress = "InProgress"
        case notFound = "NotFound"
        case success = "Success"
        public var description: String { return self.rawValue }
    }

    public enum BPAStatusMessage: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case defaultedForSlrMissing = "DEFAULTED_FOR_SLR_MISSING"
        case defaultedForSlrMissingOnHold = "DEFAULTED_FOR_SLR_MISSING_ON_HOLD"
        case syncOnHold = "SYNC_ON_HOLD"
        case unknown = "Unknown"
        public var description: String { return self.rawValue }
    }

    public enum BehaviorEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case cacheSetting = "cache"
        case dontCacheSetting = "dont-cache"
        public var description: String { return self.rawValue }
    }

    public enum BlueprintType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case app = "app"
        case os = "os"
        public var description: String { return self.rawValue }
    }

    public enum BucketMetricName: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case bucketSizeBytes = "BucketSizeBytes"
        case numberOfObjects = "NumberOfObjects"
        public var description: String { return self.rawValue }
    }

    public enum CertificateDomainValidationStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case failed = "FAILED"
        case pendingValidation = "PENDING_VALIDATION"
        case success = "SUCCESS"
        public var description: String { return self.rawValue }
    }

    public enum CertificateProvider: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case letsEncrypt = "LetsEncrypt"
        public var description: String { return self.rawValue }
    }

    public enum CertificateStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case expired = "EXPIRED"
        case failed = "FAILED"
        case inactive = "INACTIVE"
        case issued = "ISSUED"
        case pendingValidation = "PENDING_VALIDATION"
        case revoked = "REVOKED"
        case validationTimedOut = "VALIDATION_TIMED_OUT"
        public var description: String { return self.rawValue }
    }

    public enum CloudFormationStackRecordSourceType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case exportSnapshotRecord = "ExportSnapshotRecord"
        public var description: String { return self.rawValue }
    }

    public enum ComparisonOperator: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case greaterThanOrEqualToThreshold = "GreaterThanOrEqualToThreshold"
        case greaterThanThreshold = "GreaterThanThreshold"
        case lessThanOrEqualToThreshold = "LessThanOrEqualToThreshold"
        case lessThanThreshold = "LessThanThreshold"
        public var description: String { return self.rawValue }
    }

    public enum ContactMethodStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case invalid = "Invalid"
        case pendingVerification = "PendingVerification"
        case valid = "Valid"
        public var description: String { return self.rawValue }
    }

    public enum ContactMethodVerificationProtocol: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case email = "Email"
        public var description: String { return self.rawValue }
    }

    public enum ContactProtocol: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case email = "Email"
        case sms = "SMS"
        public var description: String { return self.rawValue }
    }

    public enum ContainerServiceDeploymentState: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case activating = "ACTIVATING"
        case active = "ACTIVE"
        case failed = "FAILED"
        case inactive = "INACTIVE"
        public var description: String { return self.rawValue }
    }

    public enum ContainerServiceMetricName: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case cpuUtilization = "CPUUtilization"
        case memoryUtilization = "MemoryUtilization"
        public var description: String { return self.rawValue }
    }

    public enum ContainerServicePowerName: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case large = "large"
        case medium = "medium"
        case micro = "micro"
        case nano = "nano"
        case small = "small"
        case xlarge = "xlarge"
        public var description: String { return self.rawValue }
    }

    public enum ContainerServiceProtocol: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case http = "HTTP"
        case https = "HTTPS"
        case tcp = "TCP"
        case udp = "UDP"
        public var description: String { return self.rawValue }
    }

    public enum ContainerServiceState: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case deleting = "DELETING"
        case deploying = "DEPLOYING"
        case disabled = "DISABLED"
        case pending = "PENDING"
        case ready = "READY"
        case running = "RUNNING"
        case updating = "UPDATING"
        public var description: String { return self.rawValue }
    }

    public enum ContainerServiceStateDetailCode: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case activatingDeployment = "ACTIVATING_DEPLOYMENT"
        case certificateLimitExceeded = "CERTIFICATE_LIMIT_EXCEEDED"
        case creatingDeployment = "CREATING_DEPLOYMENT"
        case creatingNetworkInfrastructure = "CREATING_NETWORK_INFRASTRUCTURE"
        case creatingSystemResources = "CREATING_SYSTEM_RESOURCES"
        case evaluatingHealthCheck = "EVALUATING_HEALTH_CHECK"
        case provisioningCertificate = "PROVISIONING_CERTIFICATE"
        case provisioningService = "PROVISIONING_SERVICE"
        case unknownError = "UNKNOWN_ERROR"
        public var description: String { return self.rawValue }
    }

    public enum Currency: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case usd = "USD"
        public var description: String { return self.rawValue }
    }

    public enum DiskSnapshotState: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case completed = "completed"
        case error = "error"
        case pending = "pending"
        case unknown = "unknown"
        public var description: String { return self.rawValue }
    }

    public enum DiskState: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case available = "available"
        case error = "error"
        case inUse = "in-use"
        case pending = "pending"
        case unknown = "unknown"
        public var description: String { return self.rawValue }
    }

    public enum DistributionMetricName: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case bytesDownloaded = "BytesDownloaded"
        case bytesUploaded = "BytesUploaded"
        case http4xxErrorRate = "Http4xxErrorRate"
        case http5xxErrorRate = "Http5xxErrorRate"
        case requests = "Requests"
        case totalErrorRate = "TotalErrorRate"
        public var description: String { return self.rawValue }
    }

    public enum DnsRecordCreationStateCode: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case failed = "FAILED"
        case started = "STARTED"
        case succeeded = "SUCCEEDED"
        public var description: String { return self.rawValue }
    }

    public enum ExportSnapshotRecordSourceType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case diskSnapshot = "DiskSnapshot"
        case instanceSnapshot = "InstanceSnapshot"
        public var description: String { return self.rawValue }
    }

    public enum ForwardValues: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case all = "all"
        case allowList = "allow-list"
        case none = "none"
        public var description: String { return self.rawValue }
    }

    public enum HeaderEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case accept = "Accept"
        case acceptCharset = "Accept-Charset"
        case acceptDatetime = "Accept-Datetime"
        case acceptEncoding = "Accept-Encoding"
        case acceptLanguage = "Accept-Language"
        case authorization = "Authorization"
        case cloudFrontForwardedProto = "CloudFront-Forwarded-Proto"
        case cloudFrontIsDesktopViewer = "CloudFront-Is-Desktop-Viewer"
        case cloudFrontIsMobileViewer = "CloudFront-Is-Mobile-Viewer"
        case cloudFrontIsSmartTVViewer = "CloudFront-Is-SmartTV-Viewer"
        case cloudFrontIsTabletViewer = "CloudFront-Is-Tablet-Viewer"
        case cloudFrontViewerCountry = "CloudFront-Viewer-Country"
        case host = "Host"
        case origin = "Origin"
        case referer = "Referer"
        public var description: String { return self.rawValue }
    }

    public enum HttpEndpoint: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case disabled = "disabled"
        case enabled = "enabled"
        public var description: String { return self.rawValue }
    }

    public enum HttpProtocolIpv6: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case disabled = "disabled"
        case enabled = "enabled"
        public var description: String { return self.rawValue }
    }

    public enum HttpTokens: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case optional = "optional"
        case required = "required"
        public var description: String { return self.rawValue }
    }

    public enum InstanceAccessProtocol: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case rdp = "rdp"
        case ssh = "ssh"
        public var description: String { return self.rawValue }
    }

    public enum InstanceHealthReason: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case instanceDeregistrationInProgress = "Instance.DeregistrationInProgress"
        case instanceFailedHealthChecks = "Instance.FailedHealthChecks"
        case instanceInvalidState = "Instance.InvalidState"
        case instanceIpUnusable = "Instance.IpUnusable"
        case instanceNotInUse = "Instance.NotInUse"
        case instanceNotRegistered = "Instance.NotRegistered"
        case instanceResponseCodeMismatch = "Instance.ResponseCodeMismatch"
        case instanceTimeout = "Instance.Timeout"
        case lbInitialHealthChecking = "Lb.InitialHealthChecking"
        case lbInternalError = "Lb.InternalError"
        case lbRegistrationInProgress = "Lb.RegistrationInProgress"
        public var description: String { return self.rawValue }
    }

    public enum InstanceHealthState: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case draining = "draining"
        case healthy = "healthy"
        case initial = "initial"
        case unavailable = "unavailable"
        case unhealthy = "unhealthy"
        case unused = "unused"
        public var description: String { return self.rawValue }
    }

    public enum InstanceMetadataState: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case applied = "applied"
        case pending = "pending"
        public var description: String { return self.rawValue }
    }

    public enum InstanceMetricName: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case burstCapacityPercentage = "BurstCapacityPercentage"
        case burstCapacityTime = "BurstCapacityTime"
        case cpuUtilization = "CPUUtilization"
        case metadataNoToken = "MetadataNoToken"
        case networkIn = "NetworkIn"
        case networkOut = "NetworkOut"
        case statusCheckFailed = "StatusCheckFailed"
        case statusCheckFailedInstance = "StatusCheckFailed_Instance"
        case statusCheckFailedSystem = "StatusCheckFailed_System"
        public var description: String { return self.rawValue }
    }

    public enum InstancePlatform: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case linuxUnix = "LINUX_UNIX"
        case windows = "WINDOWS"
        public var description: String { return self.rawValue }
    }

    public enum InstanceSnapshotState: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case available = "available"
        case error = "error"
        case pending = "pending"
        public var description: String { return self.rawValue }
    }

    public enum IpAddressType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case dualstack = "dualstack"
        case ipv4 = "ipv4"
        case ipv6 = "ipv6"
        public var description: String { return self.rawValue }
    }

    public enum LoadBalancerAttributeName: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case healthCheckPath = "HealthCheckPath"
        case httpsRedirectionEnabled = "HttpsRedirectionEnabled"
        case sessionStickinessEnabled = "SessionStickinessEnabled"
        case sessionStickinessLBCookiedurationseconds = "SessionStickiness_LB_CookieDurationSeconds"
        case tlsPolicyName = "TlsPolicyName"
        public var description: String { return self.rawValue }
    }

    public enum LoadBalancerMetricName: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case clientTLSNegotiationErrorCount = "ClientTLSNegotiationErrorCount"
        case healthyHostCount = "HealthyHostCount"
        case httpCodeInstance2XXCount = "HTTPCode_Instance_2XX_Count"
        case httpCodeInstance3XXCount = "HTTPCode_Instance_3XX_Count"
        case httpCodeInstance4XXCount = "HTTPCode_Instance_4XX_Count"
        case httpCodeInstance5XXCount = "HTTPCode_Instance_5XX_Count"
        case httpCodeLB4XXCount = "HTTPCode_LB_4XX_Count"
        case httpCodeLB5XXCount = "HTTPCode_LB_5XX_Count"
        case instanceResponseTime = "InstanceResponseTime"
        case rejectedConnectionCount = "RejectedConnectionCount"
        case requestCount = "RequestCount"
        case unhealthyHostCount = "UnhealthyHostCount"
        public var description: String { return self.rawValue }
    }

    public enum LoadBalancerProtocol: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case http = "HTTP"
        case httpHttps = "HTTP_HTTPS"
        public var description: String { return self.rawValue }
    }

    public enum LoadBalancerState: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case active = "active"
        case activeImpaired = "active_impaired"
        case failed = "failed"
        case provisioning = "provisioning"
        case unknown = "unknown"
        public var description: String { return self.rawValue }
    }

    public enum LoadBalancerTlsCertificateDnsRecordCreationStateCode: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case failed = "FAILED"
        case started = "STARTED"
        case succeeded = "SUCCEEDED"
        public var description: String { return self.rawValue }
    }

    public enum LoadBalancerTlsCertificateDomainStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case failed = "FAILED"
        case pendingValidation = "PENDING_VALIDATION"
        case success = "SUCCESS"
        public var description: String { return self.rawValue }
    }

    public enum LoadBalancerTlsCertificateFailureReason: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case additionalVerificationRequired = "ADDITIONAL_VERIFICATION_REQUIRED"
        case domainNotAllowed = "DOMAIN_NOT_ALLOWED"
        case invalidPublicDomain = "INVALID_PUBLIC_DOMAIN"
        case noAvailableContacts = "NO_AVAILABLE_CONTACTS"
        case other = "OTHER"
        public var description: String { return self.rawValue }
    }

    public enum LoadBalancerTlsCertificateRenewalStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case failed = "FAILED"
        case pendingAutoRenewal = "PENDING_AUTO_RENEWAL"
        case pendingValidation = "PENDING_VALIDATION"
        case success = "SUCCESS"
        public var description: String { return self.rawValue }
    }

    public enum LoadBalancerTlsCertificateRevocationReason: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case aaCompromise = "A_A_COMPROMISE"
        case affiliationChanged = "AFFILIATION_CHANGED"
        case caCompromise = "CA_COMPROMISE"
        case certificateHold = "CERTIFICATE_HOLD"
        case cessationOfOperation = "CESSATION_OF_OPERATION"
        case keyCompromise = "KEY_COMPROMISE"
        case privilegeWithdrawn = "PRIVILEGE_WITHDRAWN"
        case removeFromCrl = "REMOVE_FROM_CRL"
        case superceded = "SUPERCEDED"
        case unspecified = "UNSPECIFIED"
        public var description: String { return self.rawValue }
    }

    public enum LoadBalancerTlsCertificateStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case expired = "EXPIRED"
        case failed = "FAILED"
        case inactive = "INACTIVE"
        case issued = "ISSUED"
        case pendingValidation = "PENDING_VALIDATION"
        case revoked = "REVOKED"
        case unknown = "UNKNOWN"
        case validationTimedOut = "VALIDATION_TIMED_OUT"
        public var description: String { return self.rawValue }
    }

    public enum MetricName: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case burstCapacityPercentage = "BurstCapacityPercentage"
        case burstCapacityTime = "BurstCapacityTime"
        case clientTLSNegotiationErrorCount = "ClientTLSNegotiationErrorCount"
        case cpuUtilization = "CPUUtilization"
        case databaseConnections = "DatabaseConnections"
        case diskQueueDepth = "DiskQueueDepth"
        case freeStorageSpace = "FreeStorageSpace"
        case healthyHostCount = "HealthyHostCount"
        case httpCodeInstance2XXCount = "HTTPCode_Instance_2XX_Count"
        case httpCodeInstance3XXCount = "HTTPCode_Instance_3XX_Count"
        case httpCodeInstance4XXCount = "HTTPCode_Instance_4XX_Count"
        case httpCodeInstance5XXCount = "HTTPCode_Instance_5XX_Count"
        case httpCodeLB4XXCount = "HTTPCode_LB_4XX_Count"
        case httpCodeLB5XXCount = "HTTPCode_LB_5XX_Count"
        case instanceResponseTime = "InstanceResponseTime"
        case networkIn = "NetworkIn"
        case networkOut = "NetworkOut"
        case networkReceiveThroughput = "NetworkReceiveThroughput"
        case networkTransmitThroughput = "NetworkTransmitThroughput"
        case rejectedConnectionCount = "RejectedConnectionCount"
        case requestCount = "RequestCount"
        case statusCheckFailed = "StatusCheckFailed"
        case statusCheckFailedInstance = "StatusCheckFailed_Instance"
        case statusCheckFailedSystem = "StatusCheckFailed_System"
        case unhealthyHostCount = "UnhealthyHostCount"
        public var description: String { return self.rawValue }
    }

    public enum MetricStatistic: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case average = "Average"
        case maximum = "Maximum"
        case minimum = "Minimum"
        case sampleCount = "SampleCount"
        case sum = "Sum"
        public var description: String { return self.rawValue }
    }

    public enum MetricUnit: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case bits = "Bits"
        case bitsSecond = "Bits/Second"
        case bytes = "Bytes"
        case bytesSecond = "Bytes/Second"
        case count = "Count"
        case countSecond = "Count/Second"
        case gigabits = "Gigabits"
        case gigabitsSecond = "Gigabits/Second"
        case gigabytes = "Gigabytes"
        case gigabytesSecond = "Gigabytes/Second"
        case kilobits = "Kilobits"
        case kilobitsSecond = "Kilobits/Second"
        case kilobytes = "Kilobytes"
        case kilobytesSecond = "Kilobytes/Second"
        case megabits = "Megabits"
        case megabitsSecond = "Megabits/Second"
        case megabytes = "Megabytes"
        case megabytesSecond = "Megabytes/Second"
        case microseconds = "Microseconds"
        case milliseconds = "Milliseconds"
        case none = "None"
        case percent = "Percent"
        case seconds = "Seconds"
        case terabits = "Terabits"
        case terabitsSecond = "Terabits/Second"
        case terabytes = "Terabytes"
        case terabytesSecond = "Terabytes/Second"
        public var description: String { return self.rawValue }
    }

    public enum NameServersUpdateStateCode: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case failed = "FAILED"
        case pending = "PENDING"
        case started = "STARTED"
        case succeeded = "SUCCEEDED"
        public var description: String { return self.rawValue }
    }

    public enum NetworkProtocol: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case all = "all"
        case icmp = "icmp"
        case icmpv6 = "icmpv6"
        case tcp = "tcp"
        case udp = "udp"
        public var description: String { return self.rawValue }
    }

    public enum OperationStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case completed = "Completed"
        case failed = "Failed"
        case notStarted = "NotStarted"
        case started = "Started"
        case succeeded = "Succeeded"
        public var description: String { return self.rawValue }
    }

    public enum OperationType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case allocateStaticIp = "AllocateStaticIp"
        case attachCertificateToDistribution = "AttachCertificateToDistribution"
        case attachDisk = "AttachDisk"
        case attachInstancesToLoadBalancer = "AttachInstancesToLoadBalancer"
        case attachLoadBalancerTlsCertificate = "AttachLoadBalancerTlsCertificate"
        case attachStaticIp = "AttachStaticIp"
        case closeInstancePublicPorts = "CloseInstancePublicPorts"
        case createBucket = "CreateBucket"
        case createBucketAccessKey = "CreateBucketAccessKey"
        case createCertificate = "CreateCertificate"
        case createContactMethod = "CreateContactMethod"
        case createContainerService = "CreateContainerService"
        case createContainerServiceDeployment = "CreateContainerServiceDeployment"
        case createContainerServiceRegistryLogin = "CreateContainerServiceRegistryLogin"
        case createDisk = "CreateDisk"
        case createDiskFromSnapshot = "CreateDiskFromSnapshot"
        case createDiskSnapshot = "CreateDiskSnapshot"
        case createDistribution = "CreateDistribution"
        case createDomain = "CreateDomain"
        case createInstance = "CreateInstance"
        case createInstanceSnapshot = "CreateInstanceSnapshot"
        case createInstancesFromSnapshot = "CreateInstancesFromSnapshot"
        case createLoadBalancer = "CreateLoadBalancer"
        case createLoadBalancerTlsCertificate = "CreateLoadBalancerTlsCertificate"
        case createRelationalDatabase = "CreateRelationalDatabase"
        case createRelationalDatabaseFromSnapshot = "CreateRelationalDatabaseFromSnapshot"
        case createRelationalDatabaseSnapshot = "CreateRelationalDatabaseSnapshot"
        case deleteAlarm = "DeleteAlarm"
        case deleteBucket = "DeleteBucket"
        case deleteBucketAccessKey = "DeleteBucketAccessKey"
        case deleteCertificate = "DeleteCertificate"
        case deleteContactMethod = "DeleteContactMethod"
        case deleteContainerImage = "DeleteContainerImage"
        case deleteContainerService = "DeleteContainerService"
        case deleteDisk = "DeleteDisk"
        case deleteDiskSnapshot = "DeleteDiskSnapshot"
        case deleteDistribution = "DeleteDistribution"
        case deleteDomain = "DeleteDomain"
        case deleteDomainEntry = "DeleteDomainEntry"
        case deleteInstance = "DeleteInstance"
        case deleteInstanceSnapshot = "DeleteInstanceSnapshot"
        case deleteKnownHostKeys = "DeleteKnownHostKeys"
        case deleteLoadBalancer = "DeleteLoadBalancer"
        case deleteLoadBalancerTlsCertificate = "DeleteLoadBalancerTlsCertificate"
        case deleteRelationalDatabase = "DeleteRelationalDatabase"
        case deleteRelationalDatabaseSnapshot = "DeleteRelationalDatabaseSnapshot"
        case detachCertificateFromDistribution = "DetachCertificateFromDistribution"
        case detachDisk = "DetachDisk"
        case detachInstancesFromLoadBalancer = "DetachInstancesFromLoadBalancer"
        case detachStaticIp = "DetachStaticIp"
        case disableAddOn = "DisableAddOn"
        case enableAddOn = "EnableAddOn"
        case getAlarms = "GetAlarms"
        case getContactMethods = "GetContactMethods"
        case openInstancePublicPorts = "OpenInstancePublicPorts"
        case putAlarm = "PutAlarm"
        case putInstancePublicPorts = "PutInstancePublicPorts"
        case rebootInstance = "RebootInstance"
        case rebootRelationalDatabase = "RebootRelationalDatabase"
        case registerContainerImage = "RegisterContainerImage"
        case releaseStaticIp = "ReleaseStaticIp"
        case resetDistributionCache = "ResetDistributionCache"
        case sendContactMethodVerification = "SendContactMethodVerification"
        case setIpAddressType = "SetIpAddressType"
        case setResourceAccessForBucket = "SetResourceAccessForBucket"
        case setupInstanceHttps = "SetupInstanceHttps"
        case startGUISession = "StartGUISession"
        case startInstance = "StartInstance"
        case startRelationalDatabase = "StartRelationalDatabase"
        case stopGUISession = "StopGUISession"
        case stopInstance = "StopInstance"
        case stopRelationalDatabase = "StopRelationalDatabase"
        case testAlarm = "TestAlarm"
        case updateBucket = "UpdateBucket"
        case updateBucketBundle = "UpdateBucketBundle"
        case updateContainerService = "UpdateContainerService"
        case updateDistribution = "UpdateDistribution"
        case updateDistributionBundle = "UpdateDistributionBundle"
        case updateDomainEntry = "UpdateDomainEntry"
        case updateInstanceMetadataOptions = "UpdateInstanceMetadataOptions"
        case updateLoadBalancerAttribute = "UpdateLoadBalancerAttribute"
        case updateRelationalDatabase = "UpdateRelationalDatabase"
        case updateRelationalDatabaseParameters = "UpdateRelationalDatabaseParameters"
        public var description: String { return self.rawValue }
    }

    public enum OriginProtocolPolicyEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case httpOnly = "http-only"
        case httpsOnly = "https-only"
        public var description: String { return self.rawValue }
    }

    public enum PortAccessType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case `private` = "Private"
        case `public` = "Public"
        public var description: String { return self.rawValue }
    }

    public enum PortInfoSourceType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case `default` = "DEFAULT"
        case closed = "CLOSED"
        case instance = "INSTANCE"
        case none = "NONE"
        public var description: String { return self.rawValue }
    }

    public enum PortState: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case closed = "closed"
        case open = "open"
        public var description: String { return self.rawValue }
    }

    public enum PricingUnit: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case bundles = "Bundles"
        case gb = "GB"
        case gbMo = "GB-Mo"
        case hrs = "Hrs"
        case queries = "Queries"
        public var description: String { return self.rawValue }
    }

    public enum R53HostedZoneDeletionStateCode: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case failed = "FAILED"
        case pending = "PENDING"
        case started = "STARTED"
        case succeeded = "SUCCEEDED"
        public var description: String { return self.rawValue }
    }

    public enum RecordState: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case failed = "Failed"
        case started = "Started"
        case succeeded = "Succeeded"
        public var description: String { return self.rawValue }
    }

    public enum RegionName: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case apNortheast1 = "ap-northeast-1"
        case apNortheast2 = "ap-northeast-2"
        case apSouth1 = "ap-south-1"
        case apSoutheast1 = "ap-southeast-1"
        case apSoutheast2 = "ap-southeast-2"
        case caCentral1 = "ca-central-1"
        case euCentral1 = "eu-central-1"
        case euNorth1 = "eu-north-1"
        case euWest1 = "eu-west-1"
        case euWest2 = "eu-west-2"
        case euWest3 = "eu-west-3"
        case usEast1 = "us-east-1"
        case usEast2 = "us-east-2"
        case usWest1 = "us-west-1"
        case usWest2 = "us-west-2"
        public var description: String { return self.rawValue }
    }

    public enum RelationalDatabaseEngine: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case mysql = "mysql"
        public var description: String { return self.rawValue }
    }

    public enum RelationalDatabaseMetricName: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case cpuUtilization = "CPUUtilization"
        case databaseConnections = "DatabaseConnections"
        case diskQueueDepth = "DiskQueueDepth"
        case freeStorageSpace = "FreeStorageSpace"
        case networkReceiveThroughput = "NetworkReceiveThroughput"
        case networkTransmitThroughput = "NetworkTransmitThroughput"
        public var description: String { return self.rawValue }
    }

    public enum RelationalDatabasePasswordVersion: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case current = "CURRENT"
        case pending = "PENDING"
        case previous = "PREVIOUS"
        public var description: String { return self.rawValue }
    }

    public enum RenewalStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case failed = "Failed"
        case pendingAutoRenewal = "PendingAutoRenewal"
        case pendingValidation = "PendingValidation"
        case success = "Success"
        public var description: String { return self.rawValue }
    }

    public enum ResourceBucketAccess: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case allow = "allow"
        case deny = "deny"
        public var description: String { return self.rawValue }
    }

    public enum ResourceType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case alarm = "Alarm"
        case bucket = "Bucket"
        case certificate = "Certificate"
        case cloudFormationStackRecord = "CloudFormationStackRecord"
        case contactMethod = "ContactMethod"
        case containerService = "ContainerService"
        case disk = "Disk"
        case diskSnapshot = "DiskSnapshot"
        case distribution = "Distribution"
        case domain = "Domain"
        case exportSnapshotRecord = "ExportSnapshotRecord"
        case instance = "Instance"
        case instanceSnapshot = "InstanceSnapshot"
        case keyPair = "KeyPair"
        case loadBalancer = "LoadBalancer"
        case loadBalancerTlsCertificate = "LoadBalancerTlsCertificate"
        case peeredVpc = "PeeredVpc"
        case relationalDatabase = "RelationalDatabase"
        case relationalDatabaseSnapshot = "RelationalDatabaseSnapshot"
        case staticIp = "StaticIp"
        public var description: String { return self.rawValue }
    }

    public enum SetupStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case failed = "failed"
        case inProgress = "inProgress"
        case succeeded = "succeeded"
        public var description: String { return self.rawValue }
    }

    public enum Status: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case failedInstanceCreation = "failedInstanceCreation"
        case failedStartingGUISession = "failedStartingGUISession"
        case failedStoppingGUISession = "failedStoppingGUISession"
        case notStarted = "notStarted"
        case settingUpInstance = "settingUpInstance"
        case startExpired = "startExpired"
        case started = "started"
        case starting = "starting"
        case stopped = "stopped"
        case stopping = "stopping"
        public var description: String { return self.rawValue }
    }

    public enum StatusType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case active = "Active"
        case inactive = "Inactive"
        public var description: String { return self.rawValue }
    }

    public enum TreatMissingData: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case breaching = "breaching"
        case ignore = "ignore"
        case missing = "missing"
        case notBreaching = "notBreaching"
        public var description: String { return self.rawValue }
    }

    public enum ViewerMinimumTlsProtocolVersionEnum: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case tlSv112016 = "TLSv1.1_2016"
        case tlSv122018 = "TLSv1.2_2018"
        case tlSv122019 = "TLSv1.2_2019"
        case tlSv122021 = "TLSv1.2_2021"
        public var description: String { return self.rawValue }
    }

    // MARK: Shapes

    public struct AccessDeniedException: AWSErrorShape {
        public let code: String?
        public let docs: String?
        public let message: String?
        public let tip: String?

        @inlinable
        public init(code: String? = nil, docs: String? = nil, message: String? = nil, tip: String? = nil) {
            self.code = code
            self.docs = docs
            self.message = message
            self.tip = tip
        }

        private enum CodingKeys: String, CodingKey {
            case code = "code"
            case docs = "docs"
            case message = "message"
            case tip = "tip"
        }
    }

    public struct AccessKey: AWSDecodableShape {
        /// The ID of the access key.
        public let accessKeyId: String?
        /// The timestamp when the access key was created.
        public let createdAt: Date?
        /// An object that describes the last time the access key was used.  This object does not include data in the response of a CreateBucketAccessKey action. If the access key has not been used, the region and serviceName values are N/A, and the lastUsedDate value is null.
        public let lastUsed: AccessKeyLastUsed?
        /// The secret access key used to sign requests. You should store the secret access key in a safe location. We recommend that you delete the access key if the secret access key is compromised.
        public let secretAccessKey: String?
        /// The status of the access key. A status of Active means that the key is valid, while Inactive means it is not.
        public let status: StatusType?

        @inlinable
        public init(accessKeyId: String? = nil, createdAt: Date? = nil, lastUsed: AccessKeyLastUsed? = nil, secretAccessKey: String? = nil, status: StatusType? = nil) {
            self.accessKeyId = accessKeyId
            self.createdAt = createdAt
            self.lastUsed = lastUsed
            self.secretAccessKey = secretAccessKey
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case accessKeyId = "accessKeyId"
            case createdAt = "createdAt"
            case lastUsed = "lastUsed"
            case secretAccessKey = "secretAccessKey"
            case status = "status"
        }
    }

    public struct AccessKeyLastUsed: AWSDecodableShape {
        /// The date and time when the access key was most recently used. This value is null if the access key has not been used.
        public let lastUsedDate: Date?
        /// The Amazon Web Services Region where this access key was most recently used. This value is N/A if the access key has not been used.
        public let region: String?
        /// The name of the Amazon Web Services service with which this access key was most recently used. This value is N/A if the access key has not been used.
        public let serviceName: String?

        @inlinable
        public init(lastUsedDate: Date? = nil, region: String? = nil, serviceName: String? = nil) {
            self.lastUsedDate = lastUsedDate
            self.region = region
            self.serviceName = serviceName
        }

        private enum CodingKeys: String, CodingKey {
            case lastUsedDate = "lastUsedDate"
            case region = "region"
            case serviceName = "serviceName"
        }
    }

    public struct AccessRules: AWSEncodableShape & AWSDecodableShape {
        /// A Boolean value that indicates whether the access control list (ACL) permissions that are applied to individual objects override the getObject option that is currently specified. When this is true, you can use the PutObjectAcl Amazon S3 API action to set individual objects to public (read-only) using the public-read ACL, or to private using the private ACL.
        public let allowPublicOverrides: Bool?
        /// Specifies the anonymous access to all objects in a bucket. The following options can be specified:    public - Sets all objects in the bucket to public (read-only), making them readable by anyone in the world. If the getObject value is set to public, then all objects in the bucket default to public regardless of the allowPublicOverrides value.    private - Sets all objects in the bucket to private, making them readable only by you or anyone you give access to. If the getObject value is set to private, and the allowPublicOverrides value is set to true, then all objects in the bucket default to private unless they are configured with a public-read ACL. Individual objects with a public-read ACL are readable by anyone in the world.
        public let getObject: AccessType?

        @inlinable
        public init(allowPublicOverrides: Bool? = nil, getObject: AccessType? = nil) {
            self.allowPublicOverrides = allowPublicOverrides
            self.getObject = getObject
        }

        private enum CodingKeys: String, CodingKey {
            case allowPublicOverrides = "allowPublicOverrides"
            case getObject = "getObject"
        }
    }

    public struct AccountLevelBpaSync: AWSDecodableShape {
        /// A Boolean value that indicates whether account-level block public access is affecting your Lightsail buckets.
        public let bpaImpactsLightsail: Bool?
        /// The timestamp of when the account-level BPA configuration was last synchronized. This value is null when the account-level BPA configuration has not been synchronized.
        public let lastSyncedAt: Date?
        /// A message that provides a reason for a Failed or Defaulted synchronization status. The following messages are possible:    SYNC_ON_HOLD - The synchronization has not yet happened. This status message occurs immediately after you create your first Lightsail bucket. This status message should change after the first synchronization happens, approximately 1 hour after the first bucket is created.    DEFAULTED_FOR_SLR_MISSING - The synchronization failed because the required service-linked role is missing from your Amazon Web Services account. The account-level BPA configuration for your Lightsail buckets is defaulted to active until the synchronization can occur. This means that all your buckets are private and not publicly accessible. For more information about how to create the required service-linked role to allow synchronization, see Using Service-Linked Roles for Amazon Lightsail in the Amazon Lightsail Developer Guide.    DEFAULTED_FOR_SLR_MISSING_ON_HOLD - The synchronization failed because the required service-linked role is missing from your Amazon Web Services account. Account-level BPA is not yet configured for your Lightsail buckets. Therefore, only the bucket access permissions and individual object access permissions apply to your Lightsail buckets. For more information about how to create the required service-linked role to allow synchronization, see Using Service-Linked Roles for Amazon Lightsail in the Amazon Lightsail Developer Guide.    Unknown - The reason that synchronization failed is unknown. Contact Amazon Web ServicesSupport for more information.
        public let message: BPAStatusMessage?
        /// The status of the account-level BPA synchronization. The following statuses are possible:    InSync - Account-level BPA is synchronized. The Amazon S3 account-level BPA configuration applies to your Lightsail buckets.    NeverSynced - Synchronization has not yet happened. The Amazon S3 account-level BPA configuration does not apply to your Lightsail buckets.    Failed - Synchronization failed. The Amazon S3 account-level BPA configuration does not apply to your Lightsail buckets.    Defaulted - Synchronization failed and account-level BPA for your Lightsail buckets is defaulted to active.    You might need to complete further actions if the status is Failed or Defaulted. The message parameter provides more information for those statuses.
        public let status: AccountLevelBpaSyncStatus?

        @inlinable
        public init(bpaImpactsLightsail: Bool? = nil, lastSyncedAt: Date? = nil, message: BPAStatusMessage? = nil, status: AccountLevelBpaSyncStatus? = nil) {
            self.bpaImpactsLightsail = bpaImpactsLightsail
            self.lastSyncedAt = lastSyncedAt
            self.message = message
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case bpaImpactsLightsail = "bpaImpactsLightsail"
            case lastSyncedAt = "lastSyncedAt"
            case message = "message"
            case status = "status"
        }
    }

    public struct AccountSetupInProgressException: AWSErrorShape {
        public let code: String?
        public let docs: String?
        public let message: String?
        public let tip: String?

        @inlinable
        public init(code: String? = nil, docs: String? = nil, message: String? = nil, tip: String? = nil) {
            self.code = code
            self.docs = docs
            self.message = message
            self.tip = tip
        }

        private enum CodingKeys: String, CodingKey {
            case code = "code"
            case docs = "docs"
            case message = "message"
            case tip = "tip"
        }
    }

    public struct AddOn: AWSDecodableShape {
        /// The amount of idle time in minutes after which your virtual computer will automatically stop.  This add-on only applies to Lightsail for Research resources.
        public let duration: String?
        /// The name of the add-on.
        public let name: String?
        /// The next daily time an automatic snapshot will be created. The time shown is in HH:00 format, and in Coordinated Universal Time (UTC). The snapshot is automatically created between the time shown and up to 45 minutes after.
        public let nextSnapshotTimeOfDay: String?
        /// The daily time when an automatic snapshot is created. The time shown is in HH:00 format, and in Coordinated Universal Time (UTC). The snapshot is automatically created between the time shown and up to 45 minutes after.
        public let snapshotTimeOfDay: String?
        /// The status of the add-on.
        public let status: String?
        /// The trigger threshold of the action.  This add-on only applies to Lightsail for Research resources.
        public let threshold: String?

        @inlinable
        public init(duration: String? = nil, name: String? = nil, nextSnapshotTimeOfDay: String? = nil, snapshotTimeOfDay: String? = nil, status: String? = nil, threshold: String? = nil) {
            self.duration = duration
            self.name = name
            self.nextSnapshotTimeOfDay = nextSnapshotTimeOfDay
            self.snapshotTimeOfDay = snapshotTimeOfDay
            self.status = status
            self.threshold = threshold
        }

        private enum CodingKeys: String, CodingKey {
            case duration = "duration"
            case name = "name"
            case nextSnapshotTimeOfDay = "nextSnapshotTimeOfDay"
            case snapshotTimeOfDay = "snapshotTimeOfDay"
            case status = "status"
            case threshold = "threshold"
        }
    }

    public struct AddOnRequest: AWSEncodableShape {
        /// The add-on type.
        public let addOnType: AddOnType
        /// An object that represents additional parameters when enabling or modifying the automatic snapshot add-on.
        public let autoSnapshotAddOnRequest: AutoSnapshotAddOnRequest?
        /// An object that represents additional parameters when enabling or modifying the StopInstanceOnIdle add-on.  This object only applies to Lightsail for Research resources.
        public let stopInstanceOnIdleRequest: StopInstanceOnIdleRequest?

        @inlinable
        public init(addOnType: AddOnType, autoSnapshotAddOnRequest: AutoSnapshotAddOnRequest? = nil, stopInstanceOnIdleRequest: StopInstanceOnIdleRequest? = nil) {
            self.addOnType = addOnType
            self.autoSnapshotAddOnRequest = autoSnapshotAddOnRequest
            self.stopInstanceOnIdleRequest = stopInstanceOnIdleRequest
        }

        public func validate(name: String) throws {
            try self.autoSnapshotAddOnRequest?.validate(name: "\(name).autoSnapshotAddOnRequest")
        }

        private enum CodingKeys: String, CodingKey {
            case addOnType = "addOnType"
            case autoSnapshotAddOnRequest = "autoSnapshotAddOnRequest"
            case stopInstanceOnIdleRequest = "stopInstanceOnIdleRequest"
        }
    }

    public struct Alarm: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the alarm.
        public let arn: String?
        /// The arithmetic operation used when comparing the specified statistic and threshold.
        public let comparisonOperator: ComparisonOperator?
        /// The contact protocols for the alarm, such as Email, SMS (text messaging), or both.
        public let contactProtocols: [ContactProtocol]?
        /// The timestamp when the alarm was created.
        public let createdAt: Date?
        /// The number of data points that must not within the specified threshold to trigger the alarm.
        public let datapointsToAlarm: Int?
        /// The number of periods over which data is compared to the specified threshold.
        public let evaluationPeriods: Int?
        /// An object that lists information about the location of the alarm.
        public let location: ResourceLocation?
        /// The name of the metric associated with the alarm.
        public let metricName: MetricName?
        /// An object that lists information about the resource monitored by the alarm.
        public let monitoredResourceInfo: MonitoredResourceInfo?
        /// The name of the alarm.
        public let name: String?
        /// Indicates whether the alarm is enabled.
        public let notificationEnabled: Bool?
        /// The alarm states that trigger a notification.
        public let notificationTriggers: [AlarmState]?
        /// The period, in seconds, over which the statistic is applied.
        public let period: Int?
        /// The Lightsail resource type of the alarm.
        public let resourceType: ResourceType?
        /// The current state of the alarm. An alarm has the following possible states:    ALARM - The metric is outside of the defined threshold.    INSUFFICIENT_DATA - The alarm has just started, the metric is not available, or not enough data is available for the metric to determine the alarm state.    OK - The metric is within the defined threshold.
        public let state: AlarmState?
        /// The statistic for the metric associated with the alarm. The following statistics are available:    Minimum - The lowest value observed during the specified period. Use this value to determine low volumes of activity for your application.    Maximum - The highest value observed during the specified period. Use this value to determine high volumes of activity for your application.    Sum - All values submitted for the matching metric added together. You can use this statistic to determine the total volume of a metric.    Average - The value of Sum / SampleCount during the specified period. By comparing this statistic with the Minimum and Maximum values, you can determine the full scope of a metric and how close the average use is to the Minimum and Maximum values. This comparison helps you to know when to increase or decrease your resources.    SampleCount - The count, or number, of data points used for the statistical calculation.
        public let statistic: MetricStatistic?
        /// The support code. Include this code in your email to support when you have questions about your Lightsail alarm. This code enables our support team to look up your Lightsail information more easily.
        public let supportCode: String?
        /// The value against which the specified statistic is compared.
        public let threshold: Double?
        /// Specifies how the alarm handles missing data points. An alarm can treat missing data in the following ways:    breaching - Assume the missing data is not within the threshold. Missing data counts towards the number of times the metric is not within the threshold.    notBreaching - Assume the missing data is within the threshold. Missing data does not count towards the number of times the metric is not within the threshold.    ignore - Ignore the missing data. Maintains the current alarm state.    missing - Missing data is treated as missing.
        public let treatMissingData: TreatMissingData?
        /// The unit of the metric associated with the alarm.
        public let unit: MetricUnit?

        @inlinable
        public init(arn: String? = nil, comparisonOperator: ComparisonOperator? = nil, contactProtocols: [ContactProtocol]? = nil, createdAt: Date? = nil, datapointsToAlarm: Int? = nil, evaluationPeriods: Int? = nil, location: ResourceLocation? = nil, metricName: MetricName? = nil, monitoredResourceInfo: MonitoredResourceInfo? = nil, name: String? = nil, notificationEnabled: Bool? = nil, notificationTriggers: [AlarmState]? = nil, period: Int? = nil, resourceType: ResourceType? = nil, state: AlarmState? = nil, statistic: MetricStatistic? = nil, supportCode: String? = nil, threshold: Double? = nil, treatMissingData: TreatMissingData? = nil, unit: MetricUnit? = nil) {
            self.arn = arn
            self.comparisonOperator = comparisonOperator
            self.contactProtocols = contactProtocols
            self.createdAt = createdAt
            self.datapointsToAlarm = datapointsToAlarm
            self.evaluationPeriods = evaluationPeriods
            self.location = location
            self.metricName = metricName
            self.monitoredResourceInfo = monitoredResourceInfo
            self.name = name
            self.notificationEnabled = notificationEnabled
            self.notificationTriggers = notificationTriggers
            self.period = period
            self.resourceType = resourceType
            self.state = state
            self.statistic = statistic
            self.supportCode = supportCode
            self.threshold = threshold
            self.treatMissingData = treatMissingData
            self.unit = unit
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "arn"
            case comparisonOperator = "comparisonOperator"
            case contactProtocols = "contactProtocols"
            case createdAt = "createdAt"
            case datapointsToAlarm = "datapointsToAlarm"
            case evaluationPeriods = "evaluationPeriods"
            case location = "location"
            case metricName = "metricName"
            case monitoredResourceInfo = "monitoredResourceInfo"
            case name = "name"
            case notificationEnabled = "notificationEnabled"
            case notificationTriggers = "notificationTriggers"
            case period = "period"
            case resourceType = "resourceType"
            case state = "state"
            case statistic = "statistic"
            case supportCode = "supportCode"
            case threshold = "threshold"
            case treatMissingData = "treatMissingData"
            case unit = "unit"
        }
    }

    public struct AllocateStaticIpRequest: AWSEncodableShape {
        /// The name of the static IP address.
        public let staticIpName: String

        @inlinable
        public init(staticIpName: String) {
            self.staticIpName = staticIpName
        }

        public func validate(name: String) throws {
            try self.validate(self.staticIpName, name: "staticIpName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case staticIpName = "staticIpName"
        }
    }

    public struct AllocateStaticIpResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct AttachCertificateToDistributionRequest: AWSEncodableShape {
        /// The name of the certificate to attach to a distribution. Only certificates with a status of ISSUED can be attached to a distribution. Use the GetCertificates action to get a list of certificate names that you can specify.  This is the name of the certificate resource type and is used only to reference the certificate in other API actions. It can be different than the domain name of the certificate. For example, your certificate name might be WordPress-Blog-Certificate and the domain name of the certificate might be example.com.
        public let certificateName: String
        /// The name of the distribution that the certificate will be attached to. Use the GetDistributions action to get a list of distribution names that you can specify.
        public let distributionName: String

        @inlinable
        public init(certificateName: String, distributionName: String) {
            self.certificateName = certificateName
            self.distributionName = distributionName
        }

        public func validate(name: String) throws {
            try self.validate(self.certificateName, name: "certificateName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.distributionName, name: "distributionName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case certificateName = "certificateName"
            case distributionName = "distributionName"
        }
    }

    public struct AttachCertificateToDistributionResult: AWSDecodableShape {
        /// An object that describes the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operation: Operation?

        @inlinable
        public init(operation: Operation? = nil) {
            self.operation = operation
        }

        private enum CodingKeys: String, CodingKey {
            case operation = "operation"
        }
    }

    public struct AttachDiskRequest: AWSEncodableShape {
        /// A Boolean value used to determine the automatic mounting of a storage volume to a virtual computer. The default value is False.  This value only applies to Lightsail for Research resources.
        public let autoMounting: Bool?
        /// The unique Lightsail disk name (my-disk).
        public let diskName: String
        /// The disk path to expose to the instance (/dev/xvdf).
        public let diskPath: String
        /// The name of the Lightsail instance where you want to utilize the storage disk.
        public let instanceName: String

        @inlinable
        public init(autoMounting: Bool? = nil, diskName: String, diskPath: String, instanceName: String) {
            self.autoMounting = autoMounting
            self.diskName = diskName
            self.diskPath = diskPath
            self.instanceName = instanceName
        }

        public func validate(name: String) throws {
            try self.validate(self.diskName, name: "diskName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.diskPath, name: "diskPath", parent: name, pattern: "\\S")
            try self.validate(self.instanceName, name: "instanceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoMounting = "autoMounting"
            case diskName = "diskName"
            case diskPath = "diskPath"
            case instanceName = "instanceName"
        }
    }

    public struct AttachDiskResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct AttachInstancesToLoadBalancerRequest: AWSEncodableShape {
        /// An array of strings representing the instance name(s) you want to attach to your load balancer. An instance must be running before you can attach it to your load balancer. There are no additional limits on the number of instances you can attach to your load balancer, aside from the limit of Lightsail instances you can create in your account (20).
        public let instanceNames: [String]
        /// The name of the load balancer.
        public let loadBalancerName: String

        @inlinable
        public init(instanceNames: [String], loadBalancerName: String) {
            self.instanceNames = instanceNames
            self.loadBalancerName = loadBalancerName
        }

        public func validate(name: String) throws {
            try self.instanceNames.forEach {
                try validate($0, name: "instanceNames[]", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            }
            try self.validate(self.loadBalancerName, name: "loadBalancerName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case instanceNames = "instanceNames"
            case loadBalancerName = "loadBalancerName"
        }
    }

    public struct AttachInstancesToLoadBalancerResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct AttachLoadBalancerTlsCertificateRequest: AWSEncodableShape {
        /// The name of your SSL/TLS certificate.
        public let certificateName: String
        /// The name of the load balancer to which you want to associate the SSL/TLS certificate.
        public let loadBalancerName: String

        @inlinable
        public init(certificateName: String, loadBalancerName: String) {
            self.certificateName = certificateName
            self.loadBalancerName = loadBalancerName
        }

        public func validate(name: String) throws {
            try self.validate(self.certificateName, name: "certificateName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.loadBalancerName, name: "loadBalancerName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case certificateName = "certificateName"
            case loadBalancerName = "loadBalancerName"
        }
    }

    public struct AttachLoadBalancerTlsCertificateResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request. These SSL/TLS certificates are only usable by Lightsail load balancers. You can't get the certificate and use it for another purpose.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct AttachStaticIpRequest: AWSEncodableShape {
        /// The instance name to which you want to attach the static IP address.
        public let instanceName: String
        /// The name of the static IP.
        public let staticIpName: String

        @inlinable
        public init(instanceName: String, staticIpName: String) {
            self.instanceName = instanceName
            self.staticIpName = staticIpName
        }

        public func validate(name: String) throws {
            try self.validate(self.instanceName, name: "instanceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.staticIpName, name: "staticIpName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case instanceName = "instanceName"
            case staticIpName = "staticIpName"
        }
    }

    public struct AttachStaticIpResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct AttachedDisk: AWSDecodableShape {
        /// The path of the disk (/dev/xvdf).
        public let path: String?
        /// The size of the disk in GB.
        public let sizeInGb: Int?

        @inlinable
        public init(path: String? = nil, sizeInGb: Int? = nil) {
            self.path = path
            self.sizeInGb = sizeInGb
        }

        private enum CodingKeys: String, CodingKey {
            case path = "path"
            case sizeInGb = "sizeInGb"
        }
    }

    public struct AutoSnapshotAddOnRequest: AWSEncodableShape {
        /// The daily time when an automatic snapshot will be created. Constraints:   Must be in HH:00 format, and in an hourly increment.   Specified in Coordinated Universal Time (UTC).   The snapshot will be automatically created between the time specified and up to 45 minutes after.
        public let snapshotTimeOfDay: String?

        @inlinable
        public init(snapshotTimeOfDay: String? = nil) {
            self.snapshotTimeOfDay = snapshotTimeOfDay
        }

        public func validate(name: String) throws {
            try self.validate(self.snapshotTimeOfDay, name: "snapshotTimeOfDay", parent: name, pattern: "^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$")
        }

        private enum CodingKeys: String, CodingKey {
            case snapshotTimeOfDay = "snapshotTimeOfDay"
        }
    }

    public struct AutoSnapshotDetails: AWSDecodableShape {
        /// The timestamp when the automatic snapshot was created.
        public let createdAt: Date?
        /// The date of the automatic snapshot in YYYY-MM-DD format.
        public let date: String?
        /// An array of objects that describe the block storage disks attached to the instance when the automatic snapshot was created.
        public let fromAttachedDisks: [AttachedDisk]?
        /// The status of the automatic snapshot.
        public let status: AutoSnapshotStatus?

        @inlinable
        public init(createdAt: Date? = nil, date: String? = nil, fromAttachedDisks: [AttachedDisk]? = nil, status: AutoSnapshotStatus? = nil) {
            self.createdAt = createdAt
            self.date = date
            self.fromAttachedDisks = fromAttachedDisks
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case createdAt = "createdAt"
            case date = "date"
            case fromAttachedDisks = "fromAttachedDisks"
            case status = "status"
        }
    }

    public struct AvailabilityZone: AWSDecodableShape {
        /// The state of the Availability Zone.
        public let state: String?
        /// The name of the Availability Zone. The format is us-east-2a (case-sensitive).
        public let zoneName: String?

        @inlinable
        public init(state: String? = nil, zoneName: String? = nil) {
            self.state = state
            self.zoneName = zoneName
        }

        private enum CodingKeys: String, CodingKey {
            case state = "state"
            case zoneName = "zoneName"
        }
    }

    public struct Blueprint: AWSDecodableShape {
        /// Virtual computer blueprints that are supported by Lightsail for Research.  This parameter only applies to Lightsail for Research resources.
        public let appCategory: AppCategory?
        /// The ID for the virtual private server image (app_wordpress_x_x or app_lamp_x_x).
        public let blueprintId: String?
        /// The description of the blueprint.
        public let description: String?
        /// The group name of the blueprint (amazon-linux).
        public let group: String?
        /// A Boolean value indicating whether the blueprint is active. Inactive blueprints are listed to support customers with existing instances but are not necessarily available for launch of new instances. Blueprints are marked inactive when they become outdated due to operating system updates or new application releases.
        public let isActive: Bool?
        /// The end-user license agreement URL for the image or blueprint.
        public let licenseUrl: String?
        /// The minimum bundle power required to run this blueprint. For example, you need a bundle with a power value of 500 or more to create an instance that uses a blueprint with a minimum power value of 500. 0 indicates that the blueprint runs on all instance sizes.
        public let minPower: Int?
        /// The friendly name of the blueprint (Amazon Linux).
        public let name: String?
        /// The operating system platform (either Linux/Unix-based or Windows Server-based) of the blueprint.
        public let platform: InstancePlatform?
        /// The product URL to learn more about the image or blueprint.
        public let productUrl: String?
        /// The type of the blueprint (os or app).
        public let type: BlueprintType?
        /// The version number of the operating system, application, or stack ( 2016.03.0).
        public let version: String?
        /// The version code.
        public let versionCode: String?

        @inlinable
        public init(appCategory: AppCategory? = nil, blueprintId: String? = nil, description: String? = nil, group: String? = nil, isActive: Bool? = nil, licenseUrl: String? = nil, minPower: Int? = nil, name: String? = nil, platform: InstancePlatform? = nil, productUrl: String? = nil, type: BlueprintType? = nil, version: String? = nil, versionCode: String? = nil) {
            self.appCategory = appCategory
            self.blueprintId = blueprintId
            self.description = description
            self.group = group
            self.isActive = isActive
            self.licenseUrl = licenseUrl
            self.minPower = minPower
            self.name = name
            self.platform = platform
            self.productUrl = productUrl
            self.type = type
            self.version = version
            self.versionCode = versionCode
        }

        private enum CodingKeys: String, CodingKey {
            case appCategory = "appCategory"
            case blueprintId = "blueprintId"
            case description = "description"
            case group = "group"
            case isActive = "isActive"
            case licenseUrl = "licenseUrl"
            case minPower = "minPower"
            case name = "name"
            case platform = "platform"
            case productUrl = "productUrl"
            case type = "type"
            case version = "version"
            case versionCode = "versionCode"
        }
    }

    public struct Bucket: AWSDecodableShape {
        /// Indicates whether the bundle that is currently applied to a bucket can be changed to another bundle. You can update a bucket's bundle only one time within a monthly Amazon Web Services billing cycle. Use the UpdateBucketBundle action to change a bucket's bundle.
        public let ableToUpdateBundle: Bool?
        /// An object that describes the access log configuration for the bucket.
        public let accessLogConfig: BucketAccessLogConfig?
        /// An object that describes the access rules of the bucket.
        public let accessRules: AccessRules?
        /// The Amazon Resource Name (ARN) of the bucket.
        public let arn: String?
        /// The ID of the bundle currently applied to the bucket. A bucket bundle specifies the monthly cost, storage space, and data transfer quota for a bucket. Use the UpdateBucketBundle action to change the bundle of a bucket.
        public let bundleId: String?
        /// The timestamp when the distribution was created.
        public let createdAt: Date?
        /// An object that describes the location of the bucket, such as the Amazon Web Services Region and Availability Zone.
        public let location: ResourceLocation?
        /// The name of the bucket.
        public let name: String?
        /// Indicates whether object versioning is enabled for the bucket. The following options can be configured:    Enabled - Object versioning is enabled.    Suspended - Object versioning was previously enabled but is currently suspended. Existing object versions are retained.    NeverEnabled - Object versioning has never been enabled.
        public let objectVersioning: String?
        /// An array of strings that specify the Amazon Web Services account IDs that have read-only access to the bucket.
        public let readonlyAccessAccounts: [String]?
        /// An array of objects that describe Lightsail instances that have access to the bucket. Use the SetResourceAccessForBucket action to update the instances that have access to a bucket.
        public let resourcesReceivingAccess: [ResourceReceivingAccess]?
        /// The Lightsail resource type of the bucket.
        public let resourceType: String?
        /// An object that describes the state of the bucket.
        public let state: BucketState?
        /// The support code for a bucket. Include this code in your email to support when you have questions about a Lightsail bucket. This code enables our support team to look up your Lightsail information more easily.
        public let supportCode: String?
        /// The tag keys and optional values for the bucket. For more information, see Tags in Amazon Lightsail in the Amazon Lightsail Developer Guide.
        public let tags: [Tag]?
        /// The URL of the bucket.
        public let url: String?

        @inlinable
        public init(ableToUpdateBundle: Bool? = nil, accessLogConfig: BucketAccessLogConfig? = nil, accessRules: AccessRules? = nil, arn: String? = nil, bundleId: String? = nil, createdAt: Date? = nil, location: ResourceLocation? = nil, name: String? = nil, objectVersioning: String? = nil, readonlyAccessAccounts: [String]? = nil, resourcesReceivingAccess: [ResourceReceivingAccess]? = nil, resourceType: String? = nil, state: BucketState? = nil, supportCode: String? = nil, tags: [Tag]? = nil, url: String? = nil) {
            self.ableToUpdateBundle = ableToUpdateBundle
            self.accessLogConfig = accessLogConfig
            self.accessRules = accessRules
            self.arn = arn
            self.bundleId = bundleId
            self.createdAt = createdAt
            self.location = location
            self.name = name
            self.objectVersioning = objectVersioning
            self.readonlyAccessAccounts = readonlyAccessAccounts
            self.resourcesReceivingAccess = resourcesReceivingAccess
            self.resourceType = resourceType
            self.state = state
            self.supportCode = supportCode
            self.tags = tags
            self.url = url
        }

        private enum CodingKeys: String, CodingKey {
            case ableToUpdateBundle = "ableToUpdateBundle"
            case accessLogConfig = "accessLogConfig"
            case accessRules = "accessRules"
            case arn = "arn"
            case bundleId = "bundleId"
            case createdAt = "createdAt"
            case location = "location"
            case name = "name"
            case objectVersioning = "objectVersioning"
            case readonlyAccessAccounts = "readonlyAccessAccounts"
            case resourcesReceivingAccess = "resourcesReceivingAccess"
            case resourceType = "resourceType"
            case state = "state"
            case supportCode = "supportCode"
            case tags = "tags"
            case url = "url"
        }
    }

    public struct BucketAccessLogConfig: AWSEncodableShape & AWSDecodableShape {
        /// The name of the bucket where the access logs are saved. The destination can be a Lightsail bucket in the same account, and in the same Amazon Web Services Region as the source bucket.  This parameter is required when enabling the access log for a bucket, and should be omitted when disabling the access log.
        public let destination: String?
        /// A Boolean value that indicates whether bucket access logging is enabled for the bucket.
        public let enabled: Bool
        /// The optional object prefix for the bucket access log. The prefix is an optional addition to the object key that organizes your access log files in the destination bucket. For example, if you specify a logs/ prefix, then each log object will begin with the logs/ prefix in its key (for example, logs/2021-11-01-21-32-16-E568B2907131C0C0).  This parameter can be optionally specified when enabling the access log for a bucket, and should be omitted when disabling the access log.
        public let prefix: String?

        @inlinable
        public init(destination: String? = nil, enabled: Bool, prefix: String? = nil) {
            self.destination = destination
            self.enabled = enabled
            self.prefix = prefix
        }

        public func validate(name: String) throws {
            try self.validate(self.destination, name: "destination", parent: name, max: 54)
            try self.validate(self.destination, name: "destination", parent: name, min: 3)
            try self.validate(self.destination, name: "destination", parent: name, pattern: "^[a-z0-9][a-z0-9-]{1,52}[a-z0-9]$")
            try self.validate(self.prefix, name: "prefix", parent: name, max: 100)
            try self.validate(self.prefix, name: "prefix", parent: name, min: 1)
            try self.validate(self.prefix, name: "prefix", parent: name, pattern: "^[\\w/!.*')(-]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case destination = "destination"
            case enabled = "enabled"
            case prefix = "prefix"
        }
    }

    public struct BucketBundle: AWSDecodableShape {
        /// The ID of the bundle.
        public let bundleId: String?
        /// Indicates whether the bundle is active. Use for a new or existing bucket.
        public let isActive: Bool?
        /// The name of the bundle.
        public let name: String?
        /// The monthly price of the bundle, in US dollars.
        public let price: Float?
        /// The storage size of the bundle, in GB.
        public let storagePerMonthInGb: Int?
        /// The monthly network transfer quota of the bundle.
        public let transferPerMonthInGb: Int?

        @inlinable
        public init(bundleId: String? = nil, isActive: Bool? = nil, name: String? = nil, price: Float? = nil, storagePerMonthInGb: Int? = nil, transferPerMonthInGb: Int? = nil) {
            self.bundleId = bundleId
            self.isActive = isActive
            self.name = name
            self.price = price
            self.storagePerMonthInGb = storagePerMonthInGb
            self.transferPerMonthInGb = transferPerMonthInGb
        }

        private enum CodingKeys: String, CodingKey {
            case bundleId = "bundleId"
            case isActive = "isActive"
            case name = "name"
            case price = "price"
            case storagePerMonthInGb = "storagePerMonthInGb"
            case transferPerMonthInGb = "transferPerMonthInGb"
        }
    }

    public struct BucketState: AWSDecodableShape {
        /// The state code of the bucket. The following codes are possible:    OK - The bucket is in a running state.    Unknown - Creation of the bucket might have timed-out. You might want to delete the bucket and create a new one.
        public let code: String?
        /// A message that describes the state of the bucket.
        public let message: String?

        @inlinable
        public init(code: String? = nil, message: String? = nil) {
            self.code = code
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "code"
            case message = "message"
        }
    }

    public struct Bundle: AWSDecodableShape {
        /// The bundle ID (micro_x_x).
        public let bundleId: String?
        /// The number of vCPUs included in the bundle (2).
        public let cpuCount: Int?
        /// The size of the SSD (30).
        public let diskSizeInGb: Int?
        /// The instance type (micro).
        public let instanceType: String?
        /// A Boolean value indicating whether the bundle is active.
        public let isActive: Bool?
        /// A friendly name for the bundle (Micro).
        public let name: String?
        /// A numeric value that represents the power of the bundle (500). You can use the bundle's power value in conjunction with a blueprint's minimum power value to determine whether the blueprint will run on the bundle. For example, you need a bundle with a power value of 500 or more to create an instance that uses a blueprint with a minimum power value of 500.
        public let power: Int?
        /// The price in US dollars (5.0) of the bundle.
        public let price: Float?
        /// An integer that indicates the public ipv4 address count included in the bundle, the value is either 0 or 1.
        public let publicIpv4AddressCount: Int?
        /// The amount of RAM in GB (2.0).
        public let ramSizeInGb: Float?
        /// Virtual computer blueprints that are supported by a Lightsail for Research bundle.  This parameter only applies to Lightsail for Research resources.
        public let supportedAppCategories: [AppCategory]?
        /// The operating system platform (Linux/Unix-based or Windows Server-based) that the bundle supports. You can only launch a WINDOWS bundle on a blueprint that supports the WINDOWS platform. LINUX_UNIX blueprints require a LINUX_UNIX bundle.
        public let supportedPlatforms: [InstancePlatform]?
        /// The data transfer rate per month in GB (2000).
        public let transferPerMonthInGb: Int?

        @inlinable
        public init(bundleId: String? = nil, cpuCount: Int? = nil, diskSizeInGb: Int? = nil, instanceType: String? = nil, isActive: Bool? = nil, name: String? = nil, power: Int? = nil, price: Float? = nil, publicIpv4AddressCount: Int? = nil, ramSizeInGb: Float? = nil, supportedAppCategories: [AppCategory]? = nil, supportedPlatforms: [InstancePlatform]? = nil, transferPerMonthInGb: Int? = nil) {
            self.bundleId = bundleId
            self.cpuCount = cpuCount
            self.diskSizeInGb = diskSizeInGb
            self.instanceType = instanceType
            self.isActive = isActive
            self.name = name
            self.power = power
            self.price = price
            self.publicIpv4AddressCount = publicIpv4AddressCount
            self.ramSizeInGb = ramSizeInGb
            self.supportedAppCategories = supportedAppCategories
            self.supportedPlatforms = supportedPlatforms
            self.transferPerMonthInGb = transferPerMonthInGb
        }

        private enum CodingKeys: String, CodingKey {
            case bundleId = "bundleId"
            case cpuCount = "cpuCount"
            case diskSizeInGb = "diskSizeInGb"
            case instanceType = "instanceType"
            case isActive = "isActive"
            case name = "name"
            case power = "power"
            case price = "price"
            case publicIpv4AddressCount = "publicIpv4AddressCount"
            case ramSizeInGb = "ramSizeInGb"
            case supportedAppCategories = "supportedAppCategories"
            case supportedPlatforms = "supportedPlatforms"
            case transferPerMonthInGb = "transferPerMonthInGb"
        }
    }

    public struct CacheBehavior: AWSEncodableShape & AWSDecodableShape {
        /// The cache behavior of the distribution. The following cache behaviors can be specified:     cache - This option is best for static sites. When specified, your distribution caches and serves your entire website as static content. This behavior is ideal for websites with static content that doesn't change depending on who views it, or for websites that don't use cookies, headers, or query strings to personalize content.     dont-cache - This option is best for sites that serve a mix of static and dynamic content. When specified, your distribution caches and serve only the content that is specified in the distribution's CacheBehaviorPerPath parameter. This behavior is ideal for websites or web applications that use cookies, headers, and query strings to personalize content for individual users.
        public let behavior: BehaviorEnum?

        @inlinable
        public init(behavior: BehaviorEnum? = nil) {
            self.behavior = behavior
        }

        private enum CodingKeys: String, CodingKey {
            case behavior = "behavior"
        }
    }

    public struct CacheBehaviorPerPath: AWSEncodableShape & AWSDecodableShape {
        /// The cache behavior for the specified path. You can specify one of the following per-path cache behaviors:     cache - This behavior caches the specified path.      dont-cache - This behavior doesn't cache the specified path.
        public let behavior: BehaviorEnum?
        /// The path to a directory or file to cached, or not cache. Use an asterisk symbol to specify wildcard directories (path/to/assets/*), and file types (*.html, *jpg, *js). Directories and file paths are case-sensitive. Examples:   Specify the following to cache all files in the document root of an Apache web server running on a Lightsail instance.  var/www/html/    Specify the following file to cache only the index page in the document root of an Apache web server.  var/www/html/index.html    Specify the following to cache only the .html files in the document root of an Apache web server.  var/www/html/*.html    Specify the following to cache only the .jpg, .png, and .gif files in the images sub-directory of the document root of an Apache web server.  var/www/html/images/*.jpg   var/www/html/images/*.png   var/www/html/images/*.gif  Specify the following to cache all files in the images sub-directory of the document root of an Apache web server.  var/www/html/images/
        public let path: String?

        @inlinable
        public init(behavior: BehaviorEnum? = nil, path: String? = nil) {
            self.behavior = behavior
            self.path = path
        }

        private enum CodingKeys: String, CodingKey {
            case behavior = "behavior"
            case path = "path"
        }
    }

    public struct CacheSettings: AWSEncodableShape & AWSDecodableShape {
        /// The HTTP methods that are processed and forwarded to the distribution's origin. You can specify the following options:    GET,HEAD - The distribution forwards the GET and HEAD methods.    GET,HEAD,OPTIONS - The distribution forwards the GET, HEAD, and OPTIONS methods.    GET,HEAD,OPTIONS,PUT,PATCH,POST,DELETE - The distribution forwards the GET, HEAD, OPTIONS, PUT, PATCH, POST, and DELETE methods.   If you specify the third option, you might need to restrict access to your distribution's origin so users can't perform operations that you don't want them to. For example, you might not want users to have permission to delete objects from your origin.
        public let allowedHTTPMethods: String?
        /// The HTTP method responses that are cached by your distribution. You can specify the following options:    GET,HEAD - The distribution caches responses to the GET and HEAD methods.    GET,HEAD,OPTIONS - The distribution caches responses to the GET, HEAD, and OPTIONS methods.
        public let cachedHTTPMethods: String?
        /// The default amount of time that objects stay in the distribution's cache before the distribution forwards another request to the origin to determine whether the content has been updated.  The value specified applies only when the origin does not add HTTP headers such as Cache-Control max-age, Cache-Control s-maxage, and Expires to objects.
        public let defaultTTL: Int64?
        /// An object that describes the cookies that are forwarded to the origin. Your content is cached based on the cookies that are forwarded.
        public let forwardedCookies: CookieObject?
        /// An object that describes the headers that are forwarded to the origin. Your content is cached based on the headers that are forwarded.
        public let forwardedHeaders: HeaderObject?
        /// An object that describes the query strings that are forwarded to the origin. Your content is cached based on the query strings that are forwarded.
        public let forwardedQueryStrings: QueryStringObject?
        /// The maximum amount of time that objects stay in the distribution's cache before the distribution forwards another request to the origin to determine whether the object has been updated. The value specified applies only when the origin adds HTTP headers such as Cache-Control max-age, Cache-Control s-maxage, and Expires to objects.
        public let maximumTTL: Int64?
        /// The minimum amount of time that objects stay in the distribution's cache before the distribution forwards another request to the origin to determine whether the object has been updated. A value of 0 must be specified for minimumTTL if the distribution is configured to forward all headers to the origin.
        public let minimumTTL: Int64?

        @inlinable
        public init(allowedHTTPMethods: String? = nil, cachedHTTPMethods: String? = nil, defaultTTL: Int64? = nil, forwardedCookies: CookieObject? = nil, forwardedHeaders: HeaderObject? = nil, forwardedQueryStrings: QueryStringObject? = nil, maximumTTL: Int64? = nil, minimumTTL: Int64? = nil) {
            self.allowedHTTPMethods = allowedHTTPMethods
            self.cachedHTTPMethods = cachedHTTPMethods
            self.defaultTTL = defaultTTL
            self.forwardedCookies = forwardedCookies
            self.forwardedHeaders = forwardedHeaders
            self.forwardedQueryStrings = forwardedQueryStrings
            self.maximumTTL = maximumTTL
            self.minimumTTL = minimumTTL
        }

        public func validate(name: String) throws {
            try self.validate(self.allowedHTTPMethods, name: "allowedHTTPMethods", parent: name, pattern: "\\S")
            try self.validate(self.cachedHTTPMethods, name: "cachedHTTPMethods", parent: name, pattern: "\\S")
        }

        private enum CodingKeys: String, CodingKey {
            case allowedHTTPMethods = "allowedHTTPMethods"
            case cachedHTTPMethods = "cachedHTTPMethods"
            case defaultTTL = "defaultTTL"
            case forwardedCookies = "forwardedCookies"
            case forwardedHeaders = "forwardedHeaders"
            case forwardedQueryStrings = "forwardedQueryStrings"
            case maximumTTL = "maximumTTL"
            case minimumTTL = "minimumTTL"
        }
    }

    public struct Certificate: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the certificate.
        public let arn: String?
        /// The timestamp when the certificate was created.
        public let createdAt: Date?
        /// The domain name of the certificate.
        public let domainName: String?
        /// An array of objects that describe the domain validation records of the certificate.
        public let domainValidationRecords: [DomainValidationRecord]?
        /// The renewal eligibility of the certificate.
        public let eligibleToRenew: String?
        /// The number of Lightsail resources that the certificate is attached to.
        public let inUseResourceCount: Int?
        /// The timestamp when the certificate was issued.
        public let issuedAt: Date?
        /// The certificate authority that issued the certificate.
        public let issuerCA: String?
        /// The algorithm used to generate the key pair (the public and private key) of the certificate.
        public let keyAlgorithm: String?
        /// The name of the certificate (my-certificate).
        public let name: String?
        /// The timestamp when the certificate expires.
        public let notAfter: Date?
        /// The timestamp when the certificate is first valid.
        public let notBefore: Date?
        /// An object that describes the status of the certificate renewal managed by Lightsail.
        public let renewalSummary: RenewalSummary?
        /// The validation failure reason, if any, of the certificate. The following failure reasons are possible:     NO_AVAILABLE_CONTACTS - This failure applies to email validation, which is not available for Lightsail certificates.     ADDITIONAL_VERIFICATION_REQUIRED - Lightsail requires additional information to process this certificate request. This can happen as a fraud-protection measure, such as when the domain ranks within the Alexa top 1000 websites. To provide the required information, use the Amazon Web Services Support Center to contact Amazon Web Services Support.  You cannot request a certificate for Amazon-owned domain names such as those ending in amazonaws.com, cloudfront.net, or elasticbeanstalk.com.      DOMAIN_NOT_ALLOWED - One or more of the domain names in the certificate request was reported as an unsafe domain by VirusTotal. To correct the problem, search for your domain name on the VirusTotal website. If your domain is reported as suspicious, see Google Help for Hacked Websites to learn what you can do. If you believe that the result is a false positive, notify the organization that is reporting the domain. VirusTotal is an aggregate of several antivirus and URL scanners and cannot remove your domain from a block list itself. After you correct the problem and the VirusTotal registry has been updated, request a new certificate. If you see this error and your domain is not included in the VirusTotal list, visit the Amazon Web Services Support Center and create a case.     INVALID_PUBLIC_DOMAIN - One or more of the domain names in the certificate request is not valid. Typically, this is because a domain name in the request is not a valid top-level domain. Try to request a certificate again, correcting any spelling errors or typos that were in the failed request, and ensure that all domain names in the request are for valid top-level domains. For example, you cannot request a certificate for example.invalidpublicdomain because invalidpublicdomain is not a valid top-level domain.     OTHER - Typically, this failure occurs when there is a typographical error in one or more of the domain names in the certificate request. Try to request a certificate again, correcting any spelling errors or typos that were in the failed request.
        public let requestFailureReason: String?
        /// The reason the certificate was revoked. This value is present only when the certificate status is REVOKED.
        public let revocationReason: String?
        /// The timestamp when the certificate was revoked. This value is present only when the certificate status is REVOKED.
        public let revokedAt: Date?
        /// The serial number of the certificate.
        public let serialNumber: String?
        /// The validation status of the certificate.
        public let status: CertificateStatus?
        /// An array of strings that specify the alternate domains (example2.com) and subdomains (blog.example.com) of the certificate.
        public let subjectAlternativeNames: [String]?
        /// The support code. Include this code in your email to support when you have questions about your Lightsail certificate. This code enables our support team to look up your Lightsail information more easily.
        public let supportCode: String?
        /// The tag keys and optional values for the resource. For more information about tags in Lightsail, see the Amazon Lightsail Developer Guide.
        public let tags: [Tag]?

        @inlinable
        public init(arn: String? = nil, createdAt: Date? = nil, domainName: String? = nil, domainValidationRecords: [DomainValidationRecord]? = nil, eligibleToRenew: String? = nil, inUseResourceCount: Int? = nil, issuedAt: Date? = nil, issuerCA: String? = nil, keyAlgorithm: String? = nil, name: String? = nil, notAfter: Date? = nil, notBefore: Date? = nil, renewalSummary: RenewalSummary? = nil, requestFailureReason: String? = nil, revocationReason: String? = nil, revokedAt: Date? = nil, serialNumber: String? = nil, status: CertificateStatus? = nil, subjectAlternativeNames: [String]? = nil, supportCode: String? = nil, tags: [Tag]? = nil) {
            self.arn = arn
            self.createdAt = createdAt
            self.domainName = domainName
            self.domainValidationRecords = domainValidationRecords
            self.eligibleToRenew = eligibleToRenew
            self.inUseResourceCount = inUseResourceCount
            self.issuedAt = issuedAt
            self.issuerCA = issuerCA
            self.keyAlgorithm = keyAlgorithm
            self.name = name
            self.notAfter = notAfter
            self.notBefore = notBefore
            self.renewalSummary = renewalSummary
            self.requestFailureReason = requestFailureReason
            self.revocationReason = revocationReason
            self.revokedAt = revokedAt
            self.serialNumber = serialNumber
            self.status = status
            self.subjectAlternativeNames = subjectAlternativeNames
            self.supportCode = supportCode
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "arn"
            case createdAt = "createdAt"
            case domainName = "domainName"
            case domainValidationRecords = "domainValidationRecords"
            case eligibleToRenew = "eligibleToRenew"
            case inUseResourceCount = "inUseResourceCount"
            case issuedAt = "issuedAt"
            case issuerCA = "issuerCA"
            case keyAlgorithm = "keyAlgorithm"
            case name = "name"
            case notAfter = "notAfter"
            case notBefore = "notBefore"
            case renewalSummary = "renewalSummary"
            case requestFailureReason = "requestFailureReason"
            case revocationReason = "revocationReason"
            case revokedAt = "revokedAt"
            case serialNumber = "serialNumber"
            case status = "status"
            case subjectAlternativeNames = "subjectAlternativeNames"
            case supportCode = "supportCode"
            case tags = "tags"
        }
    }

    public struct CertificateSummary: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the certificate.
        public let certificateArn: String?
        /// An object that describes a certificate in detail.
        public let certificateDetail: Certificate?
        /// The name of the certificate.
        public let certificateName: String?
        /// The domain name of the certificate.
        public let domainName: String?
        /// The tag keys and optional values for the resource. For more information about tags in Lightsail, see the Amazon Lightsail Developer Guide.
        public let tags: [Tag]?

        @inlinable
        public init(certificateArn: String? = nil, certificateDetail: Certificate? = nil, certificateName: String? = nil, domainName: String? = nil, tags: [Tag]? = nil) {
            self.certificateArn = certificateArn
            self.certificateDetail = certificateDetail
            self.certificateName = certificateName
            self.domainName = domainName
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case certificateArn = "certificateArn"
            case certificateDetail = "certificateDetail"
            case certificateName = "certificateName"
            case domainName = "domainName"
            case tags = "tags"
        }
    }

    public struct CloseInstancePublicPortsRequest: AWSEncodableShape {
        /// The name of the instance for which to close ports.
        public let instanceName: String
        /// An object to describe the ports to close for the specified instance.
        public let portInfo: PortInfo

        @inlinable
        public init(instanceName: String, portInfo: PortInfo) {
            self.instanceName = instanceName
            self.portInfo = portInfo
        }

        public func validate(name: String) throws {
            try self.validate(self.instanceName, name: "instanceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.portInfo.validate(name: "\(name).portInfo")
        }

        private enum CodingKeys: String, CodingKey {
            case instanceName = "instanceName"
            case portInfo = "portInfo"
        }
    }

    public struct CloseInstancePublicPortsResult: AWSDecodableShape {
        /// An object that describes the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operation: Operation?

        @inlinable
        public init(operation: Operation? = nil) {
            self.operation = operation
        }

        private enum CodingKeys: String, CodingKey {
            case operation = "operation"
        }
    }

    public struct CloudFormationStackRecord: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the CloudFormation stack record.
        public let arn: String?
        /// The date when the CloudFormation stack record was created.
        public let createdAt: Date?
        /// A list of objects describing the destination service, which is AWS CloudFormation, and the Amazon Resource Name (ARN) of the AWS CloudFormation stack.
        public let destinationInfo: DestinationInfo?
        /// A list of objects describing the Availability Zone and Amazon Web Services Region of the CloudFormation stack record.
        public let location: ResourceLocation?
        /// The name of the CloudFormation stack record. It starts with CloudFormationStackRecord followed by a GUID.
        public let name: String?
        /// The Lightsail resource type (CloudFormationStackRecord).
        public let resourceType: ResourceType?
        /// A list of objects describing the source of the CloudFormation stack record.
        public let sourceInfo: [CloudFormationStackRecordSourceInfo]?
        /// The current state of the CloudFormation stack record.
        public let state: RecordState?

        @inlinable
        public init(arn: String? = nil, createdAt: Date? = nil, destinationInfo: DestinationInfo? = nil, location: ResourceLocation? = nil, name: String? = nil, resourceType: ResourceType? = nil, sourceInfo: [CloudFormationStackRecordSourceInfo]? = nil, state: RecordState? = nil) {
            self.arn = arn
            self.createdAt = createdAt
            self.destinationInfo = destinationInfo
            self.location = location
            self.name = name
            self.resourceType = resourceType
            self.sourceInfo = sourceInfo
            self.state = state
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "arn"
            case createdAt = "createdAt"
            case destinationInfo = "destinationInfo"
            case location = "location"
            case name = "name"
            case resourceType = "resourceType"
            case sourceInfo = "sourceInfo"
            case state = "state"
        }
    }

    public struct CloudFormationStackRecordSourceInfo: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the export snapshot record.
        public let arn: String?
        /// The name of the record.
        public let name: String?
        /// The Lightsail resource type (ExportSnapshotRecord).
        public let resourceType: CloudFormationStackRecordSourceType?

        @inlinable
        public init(arn: String? = nil, name: String? = nil, resourceType: CloudFormationStackRecordSourceType? = nil) {
            self.arn = arn
            self.name = name
            self.resourceType = resourceType
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "arn"
            case name = "name"
            case resourceType = "resourceType"
        }
    }

    public struct ContactMethod: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the contact method.
        public let arn: String?
        /// The destination of the contact method, such as an email address or a mobile phone number.
        public let contactEndpoint: String?
        /// The timestamp when the contact method was created.
        public let createdAt: Date?
        /// An object that describes the location of the contact method, such as the Amazon Web Services Region and Availability Zone.
        public let location: ResourceLocation?
        /// The name of the contact method.
        public let name: String?
        /// The protocol of the contact method, such as email or SMS (text messaging).
        public let `protocol`: ContactProtocol?
        /// The Lightsail resource type of the contact method.
        public let resourceType: ResourceType?
        /// The current status of the contact method. A contact method has the following possible status:    PendingVerification - The contact method has not yet been verified, and the verification has not yet expired.    Valid - The contact method has been verified.    InValid - An attempt was made to verify the contact method, but the verification has expired.
        public let status: ContactMethodStatus?
        /// The support code. Include this code in your email to support when you have questions about your Lightsail contact method. This code enables our support team to look up your Lightsail information more easily.
        public let supportCode: String?

        @inlinable
        public init(arn: String? = nil, contactEndpoint: String? = nil, createdAt: Date? = nil, location: ResourceLocation? = nil, name: String? = nil, protocol: ContactProtocol? = nil, resourceType: ResourceType? = nil, status: ContactMethodStatus? = nil, supportCode: String? = nil) {
            self.arn = arn
            self.contactEndpoint = contactEndpoint
            self.createdAt = createdAt
            self.location = location
            self.name = name
            self.`protocol` = `protocol`
            self.resourceType = resourceType
            self.status = status
            self.supportCode = supportCode
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "arn"
            case contactEndpoint = "contactEndpoint"
            case createdAt = "createdAt"
            case location = "location"
            case name = "name"
            case `protocol` = "protocol"
            case resourceType = "resourceType"
            case status = "status"
            case supportCode = "supportCode"
        }
    }

    public struct Container: AWSEncodableShape & AWSDecodableShape {
        /// The launch command for the container.
        public let command: [String]?
        /// The environment variables of the container.
        public let environment: [String: String]?
        /// The name of the image used for the container. Container images sourced from your Lightsail container service, that are registered and stored on your service, start with a colon (:). For example, if your container service name is container-service-1, the container image label is mystaticsite, and you want to use the third (3) version of the registered container image, then you should specify :container-service-1.mystaticsite.3. To use the latest version of a container image, specify latest instead of a version number (for example, :container-service-1.mystaticsite.latest). Lightsail will automatically use the highest numbered version of the registered container image. Container images sourced from a public registry like Docker Hub don't start with a colon. For example, nginx:latest or nginx.
        public let image: String?
        /// The open firewall ports of the container.
        public let ports: [String: ContainerServiceProtocol]?

        @inlinable
        public init(command: [String]? = nil, environment: [String: String]? = nil, image: String? = nil, ports: [String: ContainerServiceProtocol]? = nil) {
            self.command = command
            self.environment = environment
            self.image = image
            self.ports = ports
        }

        private enum CodingKeys: String, CodingKey {
            case command = "command"
            case environment = "environment"
            case image = "image"
            case ports = "ports"
        }
    }

    public struct ContainerImage: AWSDecodableShape {
        /// The timestamp when the container image was created.
        public let createdAt: Date?
        /// The digest of the container image.
        public let digest: String?
        /// The name of the container image.
        public let image: String?

        @inlinable
        public init(createdAt: Date? = nil, digest: String? = nil, image: String? = nil) {
            self.createdAt = createdAt
            self.digest = digest
            self.image = image
        }

        private enum CodingKeys: String, CodingKey {
            case createdAt = "createdAt"
            case digest = "digest"
            case image = "image"
        }
    }

    public struct ContainerService: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the container service.
        public let arn: String?
        /// The name of the container service.
        public let containerServiceName: String?
        /// The timestamp when the container service was created.
        public let createdAt: Date?
        /// An object that describes the current container deployment of the container service.
        public let currentDeployment: ContainerServiceDeployment?
        /// A Boolean value indicating whether the container service is disabled.
        public let isDisabled: Bool?
        /// An object that describes the location of the container service, such as the Amazon Web Services Region and Availability Zone.
        public let location: ResourceLocation?
        /// An object that describes the next deployment of the container service. This value is null when there is no deployment in a pending state.
        public let nextDeployment: ContainerServiceDeployment?
        /// The power specification of the container service. The power specifies the amount of RAM, the number of vCPUs, and the base price of the container service.
        public let power: ContainerServicePowerName?
        /// The ID of the power of the container service.
        public let powerId: String?
        /// The principal ARN of the container service. The principal ARN can be used to create a trust relationship between your standard Amazon Web Services account and your Lightsail container service. This allows you to give your service permission to access resources in your standard Amazon Web Services account.
        public let principalArn: String?
        /// The private domain name of the container service. The private domain name is accessible only by other resources within the default virtual private cloud (VPC) of your Lightsail account.
        public let privateDomainName: String?
        /// An object that describes the configuration for the container service to access private container image repositories, such as Amazon Elastic Container Registry (Amazon ECR) private repositories. For more information, see Configuring access to an Amazon ECR private repository for an Amazon Lightsail container service in the Amazon Lightsail Developer Guide.
        public let privateRegistryAccess: PrivateRegistryAccess?
        /// The public domain name of the container service, such as example.com and www.example.com. You can specify up to four public domain names for a container service. The domain names that you specify are used when you create a deployment with a container configured as the public endpoint of your container service. If you don't specify public domain names, then you can use the default domain of the container service.  You must create and validate an SSL/TLS certificate before you can use public domain names with your container service. Use the CreateCertificate action to create a certificate for the public domain names you want to use with your container service.  See CreateContainerService or UpdateContainerService for information about how to specify public domain names for your Lightsail container service.
        public let publicDomainNames: [String: [String]]?
        /// The Lightsail resource type of the container service.
        public let resourceType: ResourceType?
        /// The scale specification of the container service. The scale specifies the allocated compute nodes of the container service.
        public let scale: Int?
        /// The current state of the container service. The following container service states are possible:    PENDING - The container service is being created.    READY - The container service is running but it does not have an active container deployment.    DEPLOYING - The container service is launching a container deployment.    RUNNING - The container service is running and it has an active container deployment.    UPDATING - The container service capacity or its custom domains are being updated.    DELETING - The container service is being deleted.    DISABLED - The container service is disabled, and its active deployment and containers, if any, are shut down.
        public let state: ContainerServiceState?
        /// An object that describes the current state of the container service.  The state detail is populated only when a container service is in a PENDING, DEPLOYING, or UPDATING state.
        public let stateDetail: ContainerServiceStateDetail?
        /// The tag keys and optional values for the resource. For more information about tags in Lightsail, see the Amazon Lightsail Developer Guide.
        public let tags: [Tag]?
        /// The publicly accessible URL of the container service. If no public endpoint is specified in the currentDeployment, this URL returns a 404 response.
        public let url: String?

        @inlinable
        public init(arn: String? = nil, containerServiceName: String? = nil, createdAt: Date? = nil, currentDeployment: ContainerServiceDeployment? = nil, isDisabled: Bool? = nil, location: ResourceLocation? = nil, nextDeployment: ContainerServiceDeployment? = nil, power: ContainerServicePowerName? = nil, powerId: String? = nil, principalArn: String? = nil, privateDomainName: String? = nil, privateRegistryAccess: PrivateRegistryAccess? = nil, publicDomainNames: [String: [String]]? = nil, resourceType: ResourceType? = nil, scale: Int? = nil, state: ContainerServiceState? = nil, stateDetail: ContainerServiceStateDetail? = nil, tags: [Tag]? = nil, url: String? = nil) {
            self.arn = arn
            self.containerServiceName = containerServiceName
            self.createdAt = createdAt
            self.currentDeployment = currentDeployment
            self.isDisabled = isDisabled
            self.location = location
            self.nextDeployment = nextDeployment
            self.power = power
            self.powerId = powerId
            self.principalArn = principalArn
            self.privateDomainName = privateDomainName
            self.privateRegistryAccess = privateRegistryAccess
            self.publicDomainNames = publicDomainNames
            self.resourceType = resourceType
            self.scale = scale
            self.state = state
            self.stateDetail = stateDetail
            self.tags = tags
            self.url = url
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "arn"
            case containerServiceName = "containerServiceName"
            case createdAt = "createdAt"
            case currentDeployment = "currentDeployment"
            case isDisabled = "isDisabled"
            case location = "location"
            case nextDeployment = "nextDeployment"
            case power = "power"
            case powerId = "powerId"
            case principalArn = "principalArn"
            case privateDomainName = "privateDomainName"
            case privateRegistryAccess = "privateRegistryAccess"
            case publicDomainNames = "publicDomainNames"
            case resourceType = "resourceType"
            case scale = "scale"
            case state = "state"
            case stateDetail = "stateDetail"
            case tags = "tags"
            case url = "url"
        }
    }

    public struct ContainerServiceDeployment: AWSDecodableShape {
        /// An object that describes the configuration for the containers of the deployment.
        public let containers: [String: Container]?
        /// The timestamp when the deployment was created.
        public let createdAt: Date?
        /// An object that describes the endpoint of the deployment.
        public let publicEndpoint: ContainerServiceEndpoint?
        /// The state of the deployment. A deployment can be in one of the following states:    ACTIVATING - The deployment is being created.    ACTIVE - The deployment was successfully created, and it's currently running on the container service. The container service can have only one deployment in an active state at a time.    INACTIVE - The deployment was previously successfully created, but it is not currently running on the container service.    FAILED - The deployment failed. Use the GetContainerLog action to view the log events for the containers in the deployment to try to determine the reason for the failure.
        public let state: ContainerServiceDeploymentState?
        /// The version number of the deployment.
        public let version: Int?

        @inlinable
        public init(containers: [String: Container]? = nil, createdAt: Date? = nil, publicEndpoint: ContainerServiceEndpoint? = nil, state: ContainerServiceDeploymentState? = nil, version: Int? = nil) {
            self.containers = containers
            self.createdAt = createdAt
            self.publicEndpoint = publicEndpoint
            self.state = state
            self.version = version
        }

        private enum CodingKeys: String, CodingKey {
            case containers = "containers"
            case createdAt = "createdAt"
            case publicEndpoint = "publicEndpoint"
            case state = "state"
            case version = "version"
        }
    }

    public struct ContainerServiceDeploymentRequest: AWSEncodableShape {
        /// An object that describes the configuration for the containers of the deployment.
        public let containers: [String: Container]?
        /// An object that describes the endpoint of the deployment.
        public let publicEndpoint: EndpointRequest?

        @inlinable
        public init(containers: [String: Container]? = nil, publicEndpoint: EndpointRequest? = nil) {
            self.containers = containers
            self.publicEndpoint = publicEndpoint
        }

        public func validate(name: String) throws {
            try self.containers?.forEach {
                try validate($0.key, name: "containers.key", parent: name, max: 53)
                try validate($0.key, name: "containers.key", parent: name, min: 1)
                try validate($0.key, name: "containers.key", parent: name, pattern: "^[a-z0-9]{1,2}|[a-z0-9][a-z0-9-]+[a-z0-9]$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case containers = "containers"
            case publicEndpoint = "publicEndpoint"
        }
    }

    public struct ContainerServiceECRImagePullerRole: AWSDecodableShape {
        /// A Boolean value that indicates whether the role is activated.
        public let isActive: Bool?
        /// The Amazon Resource Name (ARN) of the role, if it is activated.
        public let principalArn: String?

        @inlinable
        public init(isActive: Bool? = nil, principalArn: String? = nil) {
            self.isActive = isActive
            self.principalArn = principalArn
        }

        private enum CodingKeys: String, CodingKey {
            case isActive = "isActive"
            case principalArn = "principalArn"
        }
    }

    public struct ContainerServiceECRImagePullerRoleRequest: AWSEncodableShape {
        /// A Boolean value that indicates whether to activate the role.
        public let isActive: Bool?

        @inlinable
        public init(isActive: Bool? = nil) {
            self.isActive = isActive
        }

        private enum CodingKeys: String, CodingKey {
            case isActive = "isActive"
        }
    }

    public struct ContainerServiceEndpoint: AWSDecodableShape {
        /// The name of the container entry of the deployment that the endpoint configuration applies to.
        public let containerName: String?
        /// The port of the specified container to which traffic is forwarded to.
        public let containerPort: Int?
        /// An object that describes the health check configuration of the container.
        public let healthCheck: ContainerServiceHealthCheckConfig?

        @inlinable
        public init(containerName: String? = nil, containerPort: Int? = nil, healthCheck: ContainerServiceHealthCheckConfig? = nil) {
            self.containerName = containerName
            self.containerPort = containerPort
            self.healthCheck = healthCheck
        }

        private enum CodingKeys: String, CodingKey {
            case containerName = "containerName"
            case containerPort = "containerPort"
            case healthCheck = "healthCheck"
        }
    }

    public struct ContainerServiceHealthCheckConfig: AWSEncodableShape & AWSDecodableShape {
        /// The number of consecutive health checks successes required before moving the container to the Healthy state. The default value is 2.
        public let healthyThreshold: Int?
        /// The approximate interval, in seconds, between health checks of an individual container. You can specify between 5 and 300 seconds. The default value is 5.
        public let intervalSeconds: Int?
        /// The path on the container on which to perform the health check. The default value is /.
        public let path: String?
        /// The HTTP codes to use when checking for a successful response from a container. You can specify values between 200 and 499. You can specify multiple values (for example, 200,202) or a range of values (for example, 200-299).
        public let successCodes: String?
        /// The amount of time, in seconds, during which no response means a failed health check. You can specify between 2 and 60 seconds. The default value is 2.
        public let timeoutSeconds: Int?
        /// The number of consecutive health check failures required before moving the container to the Unhealthy state. The default value is 2.
        public let unhealthyThreshold: Int?

        @inlinable
        public init(healthyThreshold: Int? = nil, intervalSeconds: Int? = nil, path: String? = nil, successCodes: String? = nil, timeoutSeconds: Int? = nil, unhealthyThreshold: Int? = nil) {
            self.healthyThreshold = healthyThreshold
            self.intervalSeconds = intervalSeconds
            self.path = path
            self.successCodes = successCodes
            self.timeoutSeconds = timeoutSeconds
            self.unhealthyThreshold = unhealthyThreshold
        }

        private enum CodingKeys: String, CodingKey {
            case healthyThreshold = "healthyThreshold"
            case intervalSeconds = "intervalSeconds"
            case path = "path"
            case successCodes = "successCodes"
            case timeoutSeconds = "timeoutSeconds"
            case unhealthyThreshold = "unhealthyThreshold"
        }
    }

    public struct ContainerServiceLogEvent: AWSDecodableShape {
        /// The timestamp when the container service log event was created.
        public let createdAt: Date?
        /// The message of the container service log event.
        public let message: String?

        @inlinable
        public init(createdAt: Date? = nil, message: String? = nil) {
            self.createdAt = createdAt
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case createdAt = "createdAt"
            case message = "message"
        }
    }

    public struct ContainerServicePower: AWSDecodableShape {
        /// The number of vCPUs included in the power.
        public let cpuCount: Float?
        /// A Boolean value indicating whether the power is active and can be specified for container services.
        public let isActive: Bool?
        /// The friendly name of the power (nano).
        public let name: String?
        /// The ID of the power (nano-1).
        public let powerId: String?
        /// The monthly price of the power in USD.
        public let price: Float?
        /// The amount of RAM (in GB) of the power.
        public let ramSizeInGb: Float?

        @inlinable
        public init(cpuCount: Float? = nil, isActive: Bool? = nil, name: String? = nil, powerId: String? = nil, price: Float? = nil, ramSizeInGb: Float? = nil) {
            self.cpuCount = cpuCount
            self.isActive = isActive
            self.name = name
            self.powerId = powerId
            self.price = price
            self.ramSizeInGb = ramSizeInGb
        }

        private enum CodingKeys: String, CodingKey {
            case cpuCount = "cpuCount"
            case isActive = "isActive"
            case name = "name"
            case powerId = "powerId"
            case price = "price"
            case ramSizeInGb = "ramSizeInGb"
        }
    }

    public struct ContainerServiceRegistryLogin: AWSDecodableShape {
        /// The timestamp of when the container image registry sign-in credentials expire. The log in credentials expire 12 hours after they are created, at which point you will need to create a new set of log in credentials using the CreateContainerServiceRegistryLogin action.
        public let expiresAt: Date?
        /// The container service registry password to use to push container images to the container image registry of a Lightsail account
        public let password: String?
        /// The address to use to push container images to the container image registry of a Lightsail account.
        public let registry: String?
        /// The container service registry username to use to push container images to the container image registry of a Lightsail account.
        public let username: String?

        @inlinable
        public init(expiresAt: Date? = nil, password: String? = nil, registry: String? = nil, username: String? = nil) {
            self.expiresAt = expiresAt
            self.password = password
            self.registry = registry
            self.username = username
        }

        private enum CodingKeys: String, CodingKey {
            case expiresAt = "expiresAt"
            case password = "password"
            case registry = "registry"
            case username = "username"
        }
    }

    public struct ContainerServiceStateDetail: AWSDecodableShape {
        /// The state code of the container service. The following state codes are possible:   The following state codes are possible if your container service is in a DEPLOYING or UPDATING state:    CREATING_SYSTEM_RESOURCES - The system resources for your container service are being created.    CREATING_NETWORK_INFRASTRUCTURE - The network infrastructure for your container service are being created.    PROVISIONING_CERTIFICATE - The SSL/TLS certificate for your container service is being created.    PROVISIONING_SERVICE - Your container service is being provisioned.    CREATING_DEPLOYMENT - Your deployment is being created on your container service.    EVALUATING_HEALTH_CHECK - The health of your deployment is being evaluated.    ACTIVATING_DEPLOYMENT - Your deployment is being activated.     The following state codes are possible if your container service is in a PENDING state:    CERTIFICATE_LIMIT_EXCEEDED - The SSL/TLS certificate required for your container service exceeds the maximum number of certificates allowed for your account.    UNKNOWN_ERROR - An error was experienced when your container service was being created.
        public let code: ContainerServiceStateDetailCode?
        /// A message that provides more information for the state code.  The state detail is populated only when a container service is in a PENDING, DEPLOYING, or UPDATING state.
        public let message: String?

        @inlinable
        public init(code: ContainerServiceStateDetailCode? = nil, message: String? = nil) {
            self.code = code
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "code"
            case message = "message"
        }
    }

    public struct ContainerServicesListResult: AWSDecodableShape {
        /// An array of objects that describe one or more container services.
        public let containerServices: [ContainerService]?

        @inlinable
        public init(containerServices: [ContainerService]? = nil) {
            self.containerServices = containerServices
        }

        private enum CodingKeys: String, CodingKey {
            case containerServices = "containerServices"
        }
    }

    public struct CookieObject: AWSEncodableShape & AWSDecodableShape {
        /// The specific cookies to forward to your distribution's origin.
        public let cookiesAllowList: [String]?
        /// Specifies which cookies to forward to the distribution's origin for a cache behavior: all, none, or allow-list to forward only the cookies specified in the cookiesAllowList parameter.
        public let option: ForwardValues?

        @inlinable
        public init(cookiesAllowList: [String]? = nil, option: ForwardValues? = nil) {
            self.cookiesAllowList = cookiesAllowList
            self.option = option
        }

        private enum CodingKeys: String, CodingKey {
            case cookiesAllowList = "cookiesAllowList"
            case option = "option"
        }
    }

    public struct CopySnapshotRequest: AWSEncodableShape {
        /// The date of the source automatic snapshot to copy. Use the get auto snapshots operation to identify the dates of the available automatic snapshots. Constraints:   Must be specified in YYYY-MM-DD format.   This parameter cannot be defined together with the use latest restorable auto snapshot parameter. The restore date and use latest restorable auto snapshot parameters are mutually exclusive.   Define this parameter only when copying an automatic snapshot as a manual snapshot. For more information, see the Amazon Lightsail Developer Guide.
        public let restoreDate: String?
        /// The Amazon Web Services Region where the source manual or automatic snapshot is located.
        public let sourceRegion: RegionName
        /// The name of the source instance or disk from which the source automatic snapshot was created. Constraint:   Define this parameter only when copying an automatic snapshot as a manual snapshot. For more information, see the Amazon Lightsail Developer Guide.
        public let sourceResourceName: String?
        /// The name of the source manual snapshot to copy. Constraint:   Define this parameter only when copying a manual snapshot as another manual snapshot.
        public let sourceSnapshotName: String?
        /// The name of the new manual snapshot to be created as a copy.
        public let targetSnapshotName: String
        /// A Boolean value to indicate whether to use the latest available automatic snapshot of the specified source instance or disk. Constraints:   This parameter cannot be defined together with the restore date parameter. The use latest restorable auto snapshot and restore date parameters are mutually exclusive.   Define this parameter only when copying an automatic snapshot as a manual snapshot. For more information, see the Amazon Lightsail Developer Guide.
        public let useLatestRestorableAutoSnapshot: Bool?

        @inlinable
        public init(restoreDate: String? = nil, sourceRegion: RegionName, sourceResourceName: String? = nil, sourceSnapshotName: String? = nil, targetSnapshotName: String, useLatestRestorableAutoSnapshot: Bool? = nil) {
            self.restoreDate = restoreDate
            self.sourceRegion = sourceRegion
            self.sourceResourceName = sourceResourceName
            self.sourceSnapshotName = sourceSnapshotName
            self.targetSnapshotName = targetSnapshotName
            self.useLatestRestorableAutoSnapshot = useLatestRestorableAutoSnapshot
        }

        public func validate(name: String) throws {
            try self.validate(self.sourceSnapshotName, name: "sourceSnapshotName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.targetSnapshotName, name: "targetSnapshotName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case restoreDate = "restoreDate"
            case sourceRegion = "sourceRegion"
            case sourceResourceName = "sourceResourceName"
            case sourceSnapshotName = "sourceSnapshotName"
            case targetSnapshotName = "targetSnapshotName"
            case useLatestRestorableAutoSnapshot = "useLatestRestorableAutoSnapshot"
        }
    }

    public struct CopySnapshotResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct CostEstimate: AWSDecodableShape {
        /// The cost estimate result that's associated with a time period.
        public let resultsByTime: [EstimateByTime]?
        /// The types of usage that are included in the estimate, such as costs, usage, or data transfer.
        public let usageType: String?

        @inlinable
        public init(resultsByTime: [EstimateByTime]? = nil, usageType: String? = nil) {
            self.resultsByTime = resultsByTime
            self.usageType = usageType
        }

        private enum CodingKeys: String, CodingKey {
            case resultsByTime = "resultsByTime"
            case usageType = "usageType"
        }
    }

    public struct CreateBucketAccessKeyRequest: AWSEncodableShape {
        /// The name of the bucket that the new access key will belong to, and grant access to.
        public let bucketName: String

        @inlinable
        public init(bucketName: String) {
            self.bucketName = bucketName
        }

        public func validate(name: String) throws {
            try self.validate(self.bucketName, name: "bucketName", parent: name, max: 54)
            try self.validate(self.bucketName, name: "bucketName", parent: name, min: 3)
            try self.validate(self.bucketName, name: "bucketName", parent: name, pattern: "^[a-z0-9][a-z0-9-]{1,52}[a-z0-9]$")
        }

        private enum CodingKeys: String, CodingKey {
            case bucketName = "bucketName"
        }
    }

    public struct CreateBucketAccessKeyResult: AWSDecodableShape {
        /// An object that describes the access key that is created.
        public let accessKey: AccessKey?
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(accessKey: AccessKey? = nil, operations: [Operation]? = nil) {
            self.accessKey = accessKey
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case accessKey = "accessKey"
            case operations = "operations"
        }
    }

    public struct CreateBucketRequest: AWSEncodableShape {
        /// The name for the bucket. For more information about bucket names, see Bucket naming rules in Amazon Lightsail in the Amazon Lightsail Developer Guide.
        public let bucketName: String
        /// The ID of the bundle to use for the bucket. A bucket bundle specifies the monthly cost, storage space, and data transfer quota for a bucket. Use the GetBucketBundles action to get a list of bundle IDs that you can specify. Use the UpdateBucketBundle action to change the bundle after the bucket is created.
        public let bundleId: String
        /// A Boolean value that indicates whether to enable versioning of objects in the bucket. For more information about versioning, see Enabling and suspending object versioning in a bucket in Amazon Lightsail in the Amazon Lightsail Developer Guide.
        public let enableObjectVersioning: Bool?
        /// The tag keys and optional values to add to the bucket during creation. Use the TagResource action to tag the bucket after it's created.
        public let tags: [Tag]?

        @inlinable
        public init(bucketName: String, bundleId: String, enableObjectVersioning: Bool? = nil, tags: [Tag]? = nil) {
            self.bucketName = bucketName
            self.bundleId = bundleId
            self.enableObjectVersioning = enableObjectVersioning
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.bucketName, name: "bucketName", parent: name, max: 54)
            try self.validate(self.bucketName, name: "bucketName", parent: name, min: 3)
            try self.validate(self.bucketName, name: "bucketName", parent: name, pattern: "^[a-z0-9][a-z0-9-]{1,52}[a-z0-9]$")
            try self.validate(self.bundleId, name: "bundleId", parent: name, pattern: "\\S")
        }

        private enum CodingKeys: String, CodingKey {
            case bucketName = "bucketName"
            case bundleId = "bundleId"
            case enableObjectVersioning = "enableObjectVersioning"
            case tags = "tags"
        }
    }

    public struct CreateBucketResult: AWSDecodableShape {
        /// An object that describes the bucket that is created.
        public let bucket: Bucket?
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(bucket: Bucket? = nil, operations: [Operation]? = nil) {
            self.bucket = bucket
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case bucket = "bucket"
            case operations = "operations"
        }
    }

    public struct CreateCertificateRequest: AWSEncodableShape {
        /// The name for the certificate.
        public let certificateName: String
        /// The domain name (example.com) for the certificate.
        public let domainName: String
        /// An array of strings that specify the alternate domains (example2.com) and subdomains (blog.example.com) for the certificate. You can specify a maximum of nine alternate domains (in addition to the primary domain name). Wildcard domain entries (*.example.com) are not supported.
        public let subjectAlternativeNames: [String]?
        /// The tag keys and optional values to add to the certificate during create. Use the TagResource action to tag a resource after it's created.
        public let tags: [Tag]?

        @inlinable
        public init(certificateName: String, domainName: String, subjectAlternativeNames: [String]? = nil, tags: [Tag]? = nil) {
            self.certificateName = certificateName
            self.domainName = domainName
            self.subjectAlternativeNames = subjectAlternativeNames
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case certificateName = "certificateName"
            case domainName = "domainName"
            case subjectAlternativeNames = "subjectAlternativeNames"
            case tags = "tags"
        }
    }

    public struct CreateCertificateResult: AWSDecodableShape {
        /// An object that describes the certificate created.
        public let certificate: CertificateSummary?
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(certificate: CertificateSummary? = nil, operations: [Operation]? = nil) {
            self.certificate = certificate
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case certificate = "certificate"
            case operations = "operations"
        }
    }

    public struct CreateCloudFormationStackRequest: AWSEncodableShape {
        /// An array of parameters that will be used to create the new Amazon EC2 instance. You can only pass one instance entry at a time in this array. You will get an invalid parameter error if you pass more than one instance entry in this array.
        public let instances: [InstanceEntry]

        @inlinable
        public init(instances: [InstanceEntry]) {
            self.instances = instances
        }

        public func validate(name: String) throws {
            try self.instances.forEach {
                try $0.validate(name: "\(name).instances[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case instances = "instances"
        }
    }

    public struct CreateCloudFormationStackResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct CreateContactMethodRequest: AWSEncodableShape {
        /// The destination of the contact method, such as an email address or a mobile phone number. Use the E.164 format when specifying a mobile phone number. E.164 is a standard for the phone number structure used for international telecommunication. Phone numbers that follow this format can have a maximum of 15 digits, and they are prefixed with the plus character (+) and the country code. For example, a U.S. phone number in E.164 format would be specified as +1XXX5550100. For more information, see E.164 on Wikipedia.
        public let contactEndpoint: String
        /// The protocol of the contact method, such as Email or SMS (text messaging). The SMS protocol is supported only in the following Amazon Web Services Regions.   US East (N. Virginia) (us-east-1)   US West (Oregon) (us-west-2)   Europe (Ireland) (eu-west-1)   Asia Pacific (Tokyo) (ap-northeast-1)   Asia Pacific (Singapore) (ap-southeast-1)   Asia Pacific (Sydney) (ap-southeast-2)   For a list of countries/regions where SMS text messages can be sent, and the latest Amazon Web Services Regions where SMS text messaging is supported, see Supported Regions and Countries in the Amazon SNS Developer Guide. For more information about notifications in Amazon Lightsail, see Notifications in Amazon Lightsail.
        public let `protocol`: ContactProtocol

        @inlinable
        public init(contactEndpoint: String, protocol: ContactProtocol) {
            self.contactEndpoint = contactEndpoint
            self.`protocol` = `protocol`
        }

        public func validate(name: String) throws {
            try self.validate(self.contactEndpoint, name: "contactEndpoint", parent: name, max: 256)
            try self.validate(self.contactEndpoint, name: "contactEndpoint", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case contactEndpoint = "contactEndpoint"
            case `protocol` = "protocol"
        }
    }

    public struct CreateContactMethodResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct CreateContainerServiceDeploymentRequest: AWSEncodableShape {
        /// An object that describes the settings of the containers that will be launched on the container service.
        public let containers: [String: Container]?
        /// An object that describes the settings of the public endpoint for the container service.
        public let publicEndpoint: EndpointRequest?
        /// The name of the container service for which to create the deployment.
        public let serviceName: String

        @inlinable
        public init(containers: [String: Container]? = nil, publicEndpoint: EndpointRequest? = nil, serviceName: String) {
            self.containers = containers
            self.publicEndpoint = publicEndpoint
            self.serviceName = serviceName
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            var container = encoder.container(keyedBy: CodingKeys.self)
            try container.encodeIfPresent(self.containers, forKey: .containers)
            try container.encodeIfPresent(self.publicEndpoint, forKey: .publicEndpoint)
            request.encodePath(self.serviceName, key: "serviceName")
        }

        public func validate(name: String) throws {
            try self.containers?.forEach {
                try validate($0.key, name: "containers.key", parent: name, max: 53)
                try validate($0.key, name: "containers.key", parent: name, min: 1)
                try validate($0.key, name: "containers.key", parent: name, pattern: "^[a-z0-9]{1,2}|[a-z0-9][a-z0-9-]+[a-z0-9]$")
            }
            try self.validate(self.serviceName, name: "serviceName", parent: name, max: 63)
            try self.validate(self.serviceName, name: "serviceName", parent: name, min: 1)
            try self.validate(self.serviceName, name: "serviceName", parent: name, pattern: "^[a-z0-9]{1,2}|[a-z0-9][a-z0-9-]+[a-z0-9]$")
        }

        private enum CodingKeys: String, CodingKey {
            case containers = "containers"
            case publicEndpoint = "publicEndpoint"
        }
    }

    public struct CreateContainerServiceDeploymentResult: AWSDecodableShape {
        /// An object that describes a container service.
        public let containerService: ContainerService?

        @inlinable
        public init(containerService: ContainerService? = nil) {
            self.containerService = containerService
        }

        private enum CodingKeys: String, CodingKey {
            case containerService = "containerService"
        }
    }

    public struct CreateContainerServiceRegistryLoginRequest: AWSEncodableShape {
        public init() {}
    }

    public struct CreateContainerServiceRegistryLoginResult: AWSDecodableShape {
        /// An object that describes the log in information for the container service registry of your Lightsail account.
        public let registryLogin: ContainerServiceRegistryLogin?

        @inlinable
        public init(registryLogin: ContainerServiceRegistryLogin? = nil) {
            self.registryLogin = registryLogin
        }

        private enum CodingKeys: String, CodingKey {
            case registryLogin = "registryLogin"
        }
    }

    public struct CreateContainerServiceRequest: AWSEncodableShape {
        /// An object that describes a deployment for the container service. A deployment specifies the containers that will be launched on the container service and their settings, such as the ports to open, the environment variables to apply, and the launch command to run. It also specifies the container that will serve as the public endpoint of the deployment and its settings, such as the HTTP or HTTPS port to use, and the health check configuration.
        public let deployment: ContainerServiceDeploymentRequest?
        /// The power specification for the container service. The power specifies the amount of memory, vCPUs, and base monthly cost of each node of the container service. The power and scale of a container service makes up its configured capacity. To determine the monthly price of your container service, multiply the base price of the power with the scale (the number of nodes) of the service. Use the GetContainerServicePowers action to get a list of power options that you can specify using this parameter, and their base monthly cost.
        public let power: ContainerServicePowerName
        /// An object to describe the configuration for the container service to access private container image repositories, such as Amazon Elastic Container Registry (Amazon ECR) private repositories. For more information, see Configuring access to an Amazon ECR private repository for an Amazon Lightsail container service in the Amazon Lightsail Developer Guide.
        public let privateRegistryAccess: PrivateRegistryAccessRequest?
        /// The public domain names to use with the container service, such as example.com and www.example.com. You can specify up to four public domain names for a container service. The domain names that you specify are used when you create a deployment with a container configured as the public endpoint of your container service. If you don't specify public domain names, then you can use the default domain of the container service.  You must create and validate an SSL/TLS certificate before you can use public domain names with your container service. Use the CreateCertificate action to create a certificate for the public domain names you want to use with your container service.  You can specify public domain names using a string to array map as shown in the example later on this page.
        public let publicDomainNames: [String: [String]]?
        /// The scale specification for the container service. The scale specifies the allocated compute nodes of the container service. The power and scale of a container service makes up its configured capacity. To determine the monthly price of your container service, multiply the base price of the power with the scale (the number of nodes) of the service.
        public let scale: Int
        /// The name for the container service. The name that you specify for your container service will make up part of its default domain. The default domain of a container service is typically https://...cs.amazonlightsail.com. If the name of your container service is container-service-1, and it's located in the US East (Ohio) Amazon Web Services Region (us-east-2), then the domain for your container service will be like the following example: https://container-service-1.ur4EXAMPLE2uq.us-east-2.cs.amazonlightsail.com  The following are the requirements for container service names:   Must be unique within each Amazon Web Services Region in your Lightsail account.   Must contain 1 to 63 characters.   Must contain only alphanumeric characters and hyphens.   A hyphen (-) can separate words but cannot be at the start or end of the name.
        public let serviceName: String
        /// The tag keys and optional values to add to the container service during create. Use the TagResource action to tag a resource after it's created. For more information about tags in Lightsail, see the Amazon Lightsail Developer Guide.
        public let tags: [Tag]?

        @inlinable
        public init(deployment: ContainerServiceDeploymentRequest? = nil, power: ContainerServicePowerName, privateRegistryAccess: PrivateRegistryAccessRequest? = nil, publicDomainNames: [String: [String]]? = nil, scale: Int, serviceName: String, tags: [Tag]? = nil) {
            self.deployment = deployment
            self.power = power
            self.privateRegistryAccess = privateRegistryAccess
            self.publicDomainNames = publicDomainNames
            self.scale = scale
            self.serviceName = serviceName
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.deployment?.validate(name: "\(name).deployment")
            try self.validate(self.scale, name: "scale", parent: name, max: 20)
            try self.validate(self.scale, name: "scale", parent: name, min: 1)
            try self.validate(self.serviceName, name: "serviceName", parent: name, max: 63)
            try self.validate(self.serviceName, name: "serviceName", parent: name, min: 1)
            try self.validate(self.serviceName, name: "serviceName", parent: name, pattern: "^[a-z0-9]{1,2}|[a-z0-9][a-z0-9-]+[a-z0-9]$")
        }

        private enum CodingKeys: String, CodingKey {
            case deployment = "deployment"
            case power = "power"
            case privateRegistryAccess = "privateRegistryAccess"
            case publicDomainNames = "publicDomainNames"
            case scale = "scale"
            case serviceName = "serviceName"
            case tags = "tags"
        }
    }

    public struct CreateContainerServiceResult: AWSDecodableShape {
        /// An object that describes a container service.
        public let containerService: ContainerService?

        @inlinable
        public init(containerService: ContainerService? = nil) {
            self.containerService = containerService
        }

        private enum CodingKeys: String, CodingKey {
            case containerService = "containerService"
        }
    }

    public struct CreateDiskFromSnapshotRequest: AWSEncodableShape {
        /// An array of objects that represent the add-ons to enable for the new disk.
        public let addOns: [AddOnRequest]?
        /// The Availability Zone where you want to create the disk (us-east-2a). Choose the same Availability Zone as the Lightsail instance where you want to create the disk. Use the GetRegions operation to list the Availability Zones where Lightsail is currently available.
        public let availabilityZone: String
        /// The unique Lightsail disk name (my-disk).
        public let diskName: String
        /// The name of the disk snapshot (my-snapshot) from which to create the new storage disk. Constraint:   This parameter cannot be defined together with the source disk name parameter. The disk snapshot name and source disk name parameters are mutually exclusive.
        public let diskSnapshotName: String?
        /// The date of the automatic snapshot to use for the new disk. Use the get auto snapshots operation to identify the dates of the available automatic snapshots. Constraints:   Must be specified in YYYY-MM-DD format.   This parameter cannot be defined together with the use latest restorable auto snapshot parameter. The restore date and use latest restorable auto snapshot parameters are mutually exclusive.   Define this parameter only when creating a new disk from an automatic snapshot. For more information, see the Amazon Lightsail Developer Guide.
        public let restoreDate: String?
        /// The size of the disk in GB (32).
        public let sizeInGb: Int
        /// The name of the source disk from which the source automatic snapshot was created. Constraints:   This parameter cannot be defined together with the disk snapshot name parameter. The source disk name and disk snapshot name parameters are mutually exclusive.   Define this parameter only when creating a new disk from an automatic snapshot. For more information, see the Amazon Lightsail Developer Guide.
        public let sourceDiskName: String?
        /// The tag keys and optional values to add to the resource during create. Use the TagResource action to tag a resource after it's created.
        public let tags: [Tag]?
        /// A Boolean value to indicate whether to use the latest available automatic snapshot. Constraints:   This parameter cannot be defined together with the restore date parameter. The use latest restorable auto snapshot and restore date parameters are mutually exclusive.   Define this parameter only when creating a new disk from an automatic snapshot. For more information, see the Amazon Lightsail Developer Guide.
        public let useLatestRestorableAutoSnapshot: Bool?

        @inlinable
        public init(addOns: [AddOnRequest]? = nil, availabilityZone: String, diskName: String, diskSnapshotName: String? = nil, restoreDate: String? = nil, sizeInGb: Int, sourceDiskName: String? = nil, tags: [Tag]? = nil, useLatestRestorableAutoSnapshot: Bool? = nil) {
            self.addOns = addOns
            self.availabilityZone = availabilityZone
            self.diskName = diskName
            self.diskSnapshotName = diskSnapshotName
            self.restoreDate = restoreDate
            self.sizeInGb = sizeInGb
            self.sourceDiskName = sourceDiskName
            self.tags = tags
            self.useLatestRestorableAutoSnapshot = useLatestRestorableAutoSnapshot
        }

        public func validate(name: String) throws {
            try self.addOns?.forEach {
                try $0.validate(name: "\(name).addOns[]")
            }
            try self.validate(self.availabilityZone, name: "availabilityZone", parent: name, pattern: "\\S")
            try self.validate(self.diskName, name: "diskName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.diskSnapshotName, name: "diskSnapshotName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case addOns = "addOns"
            case availabilityZone = "availabilityZone"
            case diskName = "diskName"
            case diskSnapshotName = "diskSnapshotName"
            case restoreDate = "restoreDate"
            case sizeInGb = "sizeInGb"
            case sourceDiskName = "sourceDiskName"
            case tags = "tags"
            case useLatestRestorableAutoSnapshot = "useLatestRestorableAutoSnapshot"
        }
    }

    public struct CreateDiskFromSnapshotResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct CreateDiskRequest: AWSEncodableShape {
        /// An array of objects that represent the add-ons to enable for the new disk.
        public let addOns: [AddOnRequest]?
        /// The Availability Zone where you want to create the disk (us-east-2a). Use the same Availability Zone as the Lightsail instance to which you want to attach the disk. Use the get regions operation to list the Availability Zones where Lightsail is currently available.
        public let availabilityZone: String
        /// The unique Lightsail disk name (my-disk).
        public let diskName: String
        /// The size of the disk in GB (32).
        public let sizeInGb: Int
        /// The tag keys and optional values to add to the resource during create. Use the TagResource action to tag a resource after it's created.
        public let tags: [Tag]?

        @inlinable
        public init(addOns: [AddOnRequest]? = nil, availabilityZone: String, diskName: String, sizeInGb: Int, tags: [Tag]? = nil) {
            self.addOns = addOns
            self.availabilityZone = availabilityZone
            self.diskName = diskName
            self.sizeInGb = sizeInGb
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.addOns?.forEach {
                try $0.validate(name: "\(name).addOns[]")
            }
            try self.validate(self.availabilityZone, name: "availabilityZone", parent: name, pattern: "\\S")
            try self.validate(self.diskName, name: "diskName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case addOns = "addOns"
            case availabilityZone = "availabilityZone"
            case diskName = "diskName"
            case sizeInGb = "sizeInGb"
            case tags = "tags"
        }
    }

    public struct CreateDiskResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct CreateDiskSnapshotRequest: AWSEncodableShape {
        /// The unique name of the source disk (Disk-Virginia-1).  This parameter cannot be defined together with the instance name parameter. The disk name and instance name parameters are mutually exclusive.
        public let diskName: String?
        /// The name of the destination disk snapshot (my-disk-snapshot) based on the source disk.
        public let diskSnapshotName: String
        /// The unique name of the source instance (Amazon_Linux-512MB-Virginia-1). When this is defined, a snapshot of the instance's system volume is created.  This parameter cannot be defined together with the disk name parameter. The instance name and disk name parameters are mutually exclusive.
        public let instanceName: String?
        /// The tag keys and optional values to add to the resource during create. Use the TagResource action to tag a resource after it's created.
        public let tags: [Tag]?

        @inlinable
        public init(diskName: String? = nil, diskSnapshotName: String, instanceName: String? = nil, tags: [Tag]? = nil) {
            self.diskName = diskName
            self.diskSnapshotName = diskSnapshotName
            self.instanceName = instanceName
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.diskName, name: "diskName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.diskSnapshotName, name: "diskSnapshotName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.instanceName, name: "instanceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case diskName = "diskName"
            case diskSnapshotName = "diskSnapshotName"
            case instanceName = "instanceName"
            case tags = "tags"
        }
    }

    public struct CreateDiskSnapshotResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct CreateDistributionRequest: AWSEncodableShape {
        /// The bundle ID to use for the distribution. A distribution bundle describes the specifications of your distribution, such as the monthly cost and monthly network transfer quota. Use the GetDistributionBundles action to get a list of distribution bundle IDs that you can specify.
        public let bundleId: String
        /// An array of objects that describe the per-path cache behavior for the distribution.
        public let cacheBehaviors: [CacheBehaviorPerPath]?
        /// An object that describes the cache behavior settings for the distribution.
        public let cacheBehaviorSettings: CacheSettings?
        /// The name of the SSL/TLS certificate that you want to attach to the distribution. Use the GetCertificates action to get a list of certificate names that you can specify.
        public let certificateName: String?
        /// An object that describes the default cache behavior for the distribution.
        public let defaultCacheBehavior: CacheBehavior
        /// The name for the distribution.
        public let distributionName: String
        /// The IP address type for the distribution. The possible values are ipv4 for IPv4 only, and dualstack for IPv4 and IPv6. The default value is dualstack.
        public let ipAddressType: IpAddressType?
        /// An object that describes the origin resource for the distribution, such as a Lightsail instance, bucket, or load balancer. The distribution pulls, caches, and serves content from the origin.
        public let origin: InputOrigin
        /// The tag keys and optional values to add to the distribution during create. Use the TagResource action to tag a resource after it's created.
        public let tags: [Tag]?
        /// The minimum TLS protocol version for the SSL/TLS certificate.
        public let viewerMinimumTlsProtocolVersion: ViewerMinimumTlsProtocolVersionEnum?

        @inlinable
        public init(bundleId: String, cacheBehaviors: [CacheBehaviorPerPath]? = nil, cacheBehaviorSettings: CacheSettings? = nil, certificateName: String? = nil, defaultCacheBehavior: CacheBehavior, distributionName: String, ipAddressType: IpAddressType? = nil, origin: InputOrigin, tags: [Tag]? = nil, viewerMinimumTlsProtocolVersion: ViewerMinimumTlsProtocolVersionEnum? = nil) {
            self.bundleId = bundleId
            self.cacheBehaviors = cacheBehaviors
            self.cacheBehaviorSettings = cacheBehaviorSettings
            self.certificateName = certificateName
            self.defaultCacheBehavior = defaultCacheBehavior
            self.distributionName = distributionName
            self.ipAddressType = ipAddressType
            self.origin = origin
            self.tags = tags
            self.viewerMinimumTlsProtocolVersion = viewerMinimumTlsProtocolVersion
        }

        public func validate(name: String) throws {
            try self.cacheBehaviorSettings?.validate(name: "\(name).cacheBehaviorSettings")
            try self.validate(self.certificateName, name: "certificateName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.distributionName, name: "distributionName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.origin.validate(name: "\(name).origin")
        }

        private enum CodingKeys: String, CodingKey {
            case bundleId = "bundleId"
            case cacheBehaviors = "cacheBehaviors"
            case cacheBehaviorSettings = "cacheBehaviorSettings"
            case certificateName = "certificateName"
            case defaultCacheBehavior = "defaultCacheBehavior"
            case distributionName = "distributionName"
            case ipAddressType = "ipAddressType"
            case origin = "origin"
            case tags = "tags"
            case viewerMinimumTlsProtocolVersion = "viewerMinimumTlsProtocolVersion"
        }
    }

    public struct CreateDistributionResult: AWSDecodableShape {
        /// An object that describes the distribution created.
        public let distribution: LightsailDistribution?
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operation: Operation?

        @inlinable
        public init(distribution: LightsailDistribution? = nil, operation: Operation? = nil) {
            self.distribution = distribution
            self.operation = operation
        }

        private enum CodingKeys: String, CodingKey {
            case distribution = "distribution"
            case operation = "operation"
        }
    }

    public struct CreateDomainEntryRequest: AWSEncodableShape {
        /// An array of key-value pairs containing information about the domain entry request.
        public let domainEntry: DomainEntry
        /// The domain name (example.com) for which you want to create the domain entry.
        public let domainName: String

        @inlinable
        public init(domainEntry: DomainEntry, domainName: String) {
            self.domainEntry = domainEntry
            self.domainName = domainName
        }

        public func validate(name: String) throws {
            try self.domainEntry.validate(name: "\(name).domainEntry")
        }

        private enum CodingKeys: String, CodingKey {
            case domainEntry = "domainEntry"
            case domainName = "domainName"
        }
    }

    public struct CreateDomainEntryResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operation: Operation?

        @inlinable
        public init(operation: Operation? = nil) {
            self.operation = operation
        }

        private enum CodingKeys: String, CodingKey {
            case operation = "operation"
        }
    }

    public struct CreateDomainRequest: AWSEncodableShape {
        /// The domain name to manage (example.com).
        public let domainName: String
        /// The tag keys and optional values to add to the resource during create. Use the TagResource action to tag a resource after it's created.
        public let tags: [Tag]?

        @inlinable
        public init(domainName: String, tags: [Tag]? = nil) {
            self.domainName = domainName
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case domainName = "domainName"
            case tags = "tags"
        }
    }

    public struct CreateDomainResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operation: Operation?

        @inlinable
        public init(operation: Operation? = nil) {
            self.operation = operation
        }

        private enum CodingKeys: String, CodingKey {
            case operation = "operation"
        }
    }

    public struct CreateGUISessionAccessDetailsRequest: AWSEncodableShape {
        /// The resource name.
        public let resourceName: String

        @inlinable
        public init(resourceName: String) {
            self.resourceName = resourceName
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceName, name: "resourceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case resourceName = "resourceName"
        }
    }

    public struct CreateGUISessionAccessDetailsResult: AWSDecodableShape {
        /// The reason the operation failed.
        public let failureReason: String?
        /// The percentage of completion for the operation.
        public let percentageComplete: Int?
        /// The resource name.
        public let resourceName: String?
        /// Returns information about the specified Amazon DCV GUI session.
        public let sessions: [Session]?
        /// The status of the operation.
        public let status: Status?

        @inlinable
        public init(failureReason: String? = nil, percentageComplete: Int? = nil, resourceName: String? = nil, sessions: [Session]? = nil, status: Status? = nil) {
            self.failureReason = failureReason
            self.percentageComplete = percentageComplete
            self.resourceName = resourceName
            self.sessions = sessions
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case failureReason = "failureReason"
            case percentageComplete = "percentageComplete"
            case resourceName = "resourceName"
            case sessions = "sessions"
            case status = "status"
        }
    }

    public struct CreateInstanceSnapshotRequest: AWSEncodableShape {
        /// The Lightsail instance on which to base your snapshot.
        public let instanceName: String
        /// The name for your new snapshot.
        public let instanceSnapshotName: String
        /// The tag keys and optional values to add to the resource during create. Use the TagResource action to tag a resource after it's created.
        public let tags: [Tag]?

        @inlinable
        public init(instanceName: String, instanceSnapshotName: String, tags: [Tag]? = nil) {
            self.instanceName = instanceName
            self.instanceSnapshotName = instanceSnapshotName
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.instanceName, name: "instanceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.instanceSnapshotName, name: "instanceSnapshotName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case instanceName = "instanceName"
            case instanceSnapshotName = "instanceSnapshotName"
            case tags = "tags"
        }
    }

    public struct CreateInstanceSnapshotResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct CreateInstancesFromSnapshotRequest: AWSEncodableShape {
        /// An array of objects representing the add-ons to enable for the new instance.
        public let addOns: [AddOnRequest]?
        /// An object containing information about one or more disk mappings.
        public let attachedDiskMapping: [String: [DiskMap]]?
        /// The Availability Zone where you want to create your instances. Use the following formatting: us-east-2a (case sensitive). You can get a list of Availability Zones by using the get regions operation. Be sure to add the include Availability Zones parameter to your request.
        public let availabilityZone: String
        /// The bundle of specification information for your virtual private server (or instance), including the pricing plan (micro_x_x).
        public let bundleId: String
        /// The names for your new instances.
        public let instanceNames: [String]
        /// The name of the instance snapshot on which you are basing your new instances. Use the get instance snapshots operation to return information about your existing snapshots. Constraint:   This parameter cannot be defined together with the source instance name parameter. The instance snapshot name and source instance name parameters are mutually exclusive.
        public let instanceSnapshotName: String?
        /// The IP address type for the instance. The possible values are ipv4 for IPv4 only, ipv6 for IPv6 only, and dualstack for IPv4 and IPv6. The default value is dualstack.
        public let ipAddressType: IpAddressType?
        /// The name for your key pair.
        public let keyPairName: String?
        /// The date of the automatic snapshot to use for the new instance. Use the get auto snapshots operation to identify the dates of the available automatic snapshots. Constraints:   Must be specified in YYYY-MM-DD format.   This parameter cannot be defined together with the use latest restorable auto snapshot parameter. The restore date and use latest restorable auto snapshot parameters are mutually exclusive.   Define this parameter only when creating a new instance from an automatic snapshot. For more information, see the Amazon Lightsail Developer Guide.
        public let restoreDate: String?
        /// The name of the source instance from which the source automatic snapshot was created. Constraints:   This parameter cannot be defined together with the instance snapshot name parameter. The source instance name and instance snapshot name parameters are mutually exclusive.   Define this parameter only when creating a new instance from an automatic snapshot. For more information, see the Amazon Lightsail Developer Guide.
        public let sourceInstanceName: String?
        /// The tag keys and optional values to add to the resource during create. Use the TagResource action to tag a resource after it's created.
        public let tags: [Tag]?
        /// A Boolean value to indicate whether to use the latest available automatic snapshot. Constraints:   This parameter cannot be defined together with the restore date parameter. The use latest restorable auto snapshot and restore date parameters are mutually exclusive.   Define this parameter only when creating a new instance from an automatic snapshot. For more information, see the Amazon Lightsail Developer Guide.
        public let useLatestRestorableAutoSnapshot: Bool?
        /// You can create a launch script that configures a server with additional user data. For example, apt-get -y update.  Depending on the machine image you choose, the command to get software on your instance varies. Amazon Linux and CentOS use yum, Debian and Ubuntu use apt-get, and FreeBSD uses pkg. For a complete list, see the Amazon Lightsail Developer Guide.
        public let userData: String?

        @inlinable
        public init(addOns: [AddOnRequest]? = nil, attachedDiskMapping: [String: [DiskMap]]? = nil, availabilityZone: String, bundleId: String, instanceNames: [String], instanceSnapshotName: String? = nil, ipAddressType: IpAddressType? = nil, keyPairName: String? = nil, restoreDate: String? = nil, sourceInstanceName: String? = nil, tags: [Tag]? = nil, useLatestRestorableAutoSnapshot: Bool? = nil, userData: String? = nil) {
            self.addOns = addOns
            self.attachedDiskMapping = attachedDiskMapping
            self.availabilityZone = availabilityZone
            self.bundleId = bundleId
            self.instanceNames = instanceNames
            self.instanceSnapshotName = instanceSnapshotName
            self.ipAddressType = ipAddressType
            self.keyPairName = keyPairName
            self.restoreDate = restoreDate
            self.sourceInstanceName = sourceInstanceName
            self.tags = tags
            self.useLatestRestorableAutoSnapshot = useLatestRestorableAutoSnapshot
            self.userData = userData
        }

        public func validate(name: String) throws {
            try self.addOns?.forEach {
                try $0.validate(name: "\(name).addOns[]")
            }
            try self.attachedDiskMapping?.forEach {
                try validate($0.key, name: "attachedDiskMapping.key", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            }
            try self.validate(self.bundleId, name: "bundleId", parent: name, pattern: "\\S")
            try self.validate(self.instanceSnapshotName, name: "instanceSnapshotName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.keyPairName, name: "keyPairName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case addOns = "addOns"
            case attachedDiskMapping = "attachedDiskMapping"
            case availabilityZone = "availabilityZone"
            case bundleId = "bundleId"
            case instanceNames = "instanceNames"
            case instanceSnapshotName = "instanceSnapshotName"
            case ipAddressType = "ipAddressType"
            case keyPairName = "keyPairName"
            case restoreDate = "restoreDate"
            case sourceInstanceName = "sourceInstanceName"
            case tags = "tags"
            case useLatestRestorableAutoSnapshot = "useLatestRestorableAutoSnapshot"
            case userData = "userData"
        }
    }

    public struct CreateInstancesFromSnapshotResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct CreateInstancesRequest: AWSEncodableShape {
        /// An array of objects representing the add-ons to enable for the new instance.
        public let addOns: [AddOnRequest]?
        /// The Availability Zone in which to create your instance. Use the following format: us-east-2a (case sensitive). You can get a list of Availability Zones by using the get regions operation. Be sure to add the include Availability Zones parameter to your request.
        public let availabilityZone: String
        /// The ID for a virtual private server image (app_wordpress_x_x or app_lamp_x_x). Use the get blueprints operation to return a list of available images (or blueprints).  Use active blueprints when creating new instances. Inactive blueprints are listed to support customers with existing instances and are not necessarily available to create new instances. Blueprints are marked inactive when they become outdated due to operating system updates or new application releases.
        public let blueprintId: String
        /// The bundle of specification information for your virtual private server (or instance), including the pricing plan (medium_x_x).
        public let bundleId: String
        /// (Discontinued) The name for your custom image.  In releases prior to June 12, 2017, this parameter was ignored by the API. It is now discontinued.
        public let customImageName: String?
        /// The names to use for your new Lightsail instances. Separate multiple values using quotation marks and commas, for example: ["MyFirstInstance","MySecondInstance"]
        public let instanceNames: [String]
        /// The IP address type for the instance. The possible values are ipv4 for IPv4 only, ipv6 for IPv6 only, and dualstack for IPv4 and IPv6. The default value is dualstack.
        public let ipAddressType: IpAddressType?
        /// The name of your key pair.
        public let keyPairName: String?
        /// The tag keys and optional values to add to the resource during create. Use the TagResource action to tag a resource after it's created.
        public let tags: [Tag]?
        /// A launch script you can create that configures a server with additional user data. For example, you might want to run apt-get -y update.  Depending on the machine image you choose, the command to get software on your instance varies. Amazon Linux and CentOS use yum, Debian and Ubuntu use apt-get, and FreeBSD uses pkg. For a complete list, see the Amazon Lightsail Developer Guide.
        public let userData: String?

        @inlinable
        public init(addOns: [AddOnRequest]? = nil, availabilityZone: String, blueprintId: String, bundleId: String, instanceNames: [String], ipAddressType: IpAddressType? = nil, keyPairName: String? = nil, tags: [Tag]? = nil, userData: String? = nil) {
            self.addOns = addOns
            self.availabilityZone = availabilityZone
            self.blueprintId = blueprintId
            self.bundleId = bundleId
            self.customImageName = nil
            self.instanceNames = instanceNames
            self.ipAddressType = ipAddressType
            self.keyPairName = keyPairName
            self.tags = tags
            self.userData = userData
        }

        @available(*, deprecated, message: "Members customImageName have been deprecated")
        @inlinable
        public init(addOns: [AddOnRequest]? = nil, availabilityZone: String, blueprintId: String, bundleId: String, customImageName: String? = nil, instanceNames: [String], ipAddressType: IpAddressType? = nil, keyPairName: String? = nil, tags: [Tag]? = nil, userData: String? = nil) {
            self.addOns = addOns
            self.availabilityZone = availabilityZone
            self.blueprintId = blueprintId
            self.bundleId = bundleId
            self.customImageName = customImageName
            self.instanceNames = instanceNames
            self.ipAddressType = ipAddressType
            self.keyPairName = keyPairName
            self.tags = tags
            self.userData = userData
        }

        public func validate(name: String) throws {
            try self.addOns?.forEach {
                try $0.validate(name: "\(name).addOns[]")
            }
            try self.validate(self.blueprintId, name: "blueprintId", parent: name, pattern: "\\S")
            try self.validate(self.bundleId, name: "bundleId", parent: name, pattern: "\\S")
            try self.validate(self.customImageName, name: "customImageName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.keyPairName, name: "keyPairName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case addOns = "addOns"
            case availabilityZone = "availabilityZone"
            case blueprintId = "blueprintId"
            case bundleId = "bundleId"
            case customImageName = "customImageName"
            case instanceNames = "instanceNames"
            case ipAddressType = "ipAddressType"
            case keyPairName = "keyPairName"
            case tags = "tags"
            case userData = "userData"
        }
    }

    public struct CreateInstancesResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct CreateKeyPairRequest: AWSEncodableShape {
        /// The name for your new key pair.
        public let keyPairName: String
        /// The tag keys and optional values to add to the resource during create. Use the TagResource action to tag a resource after it's created.
        public let tags: [Tag]?

        @inlinable
        public init(keyPairName: String, tags: [Tag]? = nil) {
            self.keyPairName = keyPairName
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.keyPairName, name: "keyPairName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case keyPairName = "keyPairName"
            case tags = "tags"
        }
    }

    public struct CreateKeyPairResult: AWSDecodableShape {
        /// An array of key-value pairs containing information about the new key pair you just created.
        public let keyPair: KeyPair?
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operation: Operation?
        /// A base64-encoded RSA private key.
        public let privateKeyBase64: String?
        /// A base64-encoded public key of the ssh-rsa type.
        public let publicKeyBase64: String?

        @inlinable
        public init(keyPair: KeyPair? = nil, operation: Operation? = nil, privateKeyBase64: String? = nil, publicKeyBase64: String? = nil) {
            self.keyPair = keyPair
            self.operation = operation
            self.privateKeyBase64 = privateKeyBase64
            self.publicKeyBase64 = publicKeyBase64
        }

        private enum CodingKeys: String, CodingKey {
            case keyPair = "keyPair"
            case operation = "operation"
            case privateKeyBase64 = "privateKeyBase64"
            case publicKeyBase64 = "publicKeyBase64"
        }
    }

    public struct CreateLoadBalancerRequest: AWSEncodableShape {
        /// The optional alternative domains and subdomains to use with your SSL/TLS certificate (www.example.com, example.com, m.example.com, blog.example.com).
        public let certificateAlternativeNames: [String]?
        /// The domain name with which your certificate is associated (example.com). If you specify certificateDomainName, then certificateName is required (and vice-versa).
        public let certificateDomainName: String?
        /// The name of the SSL/TLS certificate. If you specify certificateName, then certificateDomainName is required (and vice-versa).
        public let certificateName: String?
        /// The path you provided to perform the load balancer health check. If you didn't specify a health check path, Lightsail uses the root path of your website ("/"). You may want to specify a custom health check path other than the root of your application if your home page loads slowly or has a lot of media or scripting on it.
        public let healthCheckPath: String?
        /// The instance port where you're creating your load balancer.
        public let instancePort: Int
        /// The IP address type for the load balancer. The possible values are ipv4 for IPv4 only, ipv6 for IPv6 only, and dualstack for IPv4 and IPv6. The default value is dualstack.
        public let ipAddressType: IpAddressType?
        /// The name of your load balancer.
        public let loadBalancerName: String
        /// The tag keys and optional values to add to the resource during create. Use the TagResource action to tag a resource after it's created.
        public let tags: [Tag]?
        /// The name of the TLS policy to apply to the load balancer. Use the GetLoadBalancerTlsPolicies action to get a list of TLS policy names that you can specify. For more information about load balancer TLS policies, see Configuring TLS security policies on your Amazon Lightsail load balancers in the Amazon Lightsail Developer Guide.
        public let tlsPolicyName: String?

        @inlinable
        public init(certificateAlternativeNames: [String]? = nil, certificateDomainName: String? = nil, certificateName: String? = nil, healthCheckPath: String? = nil, instancePort: Int = 0, ipAddressType: IpAddressType? = nil, loadBalancerName: String, tags: [Tag]? = nil, tlsPolicyName: String? = nil) {
            self.certificateAlternativeNames = certificateAlternativeNames
            self.certificateDomainName = certificateDomainName
            self.certificateName = certificateName
            self.healthCheckPath = healthCheckPath
            self.instancePort = instancePort
            self.ipAddressType = ipAddressType
            self.loadBalancerName = loadBalancerName
            self.tags = tags
            self.tlsPolicyName = tlsPolicyName
        }

        public func validate(name: String) throws {
            try self.validate(self.certificateName, name: "certificateName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.instancePort, name: "instancePort", parent: name, max: 65535)
            try self.validate(self.instancePort, name: "instancePort", parent: name, min: -1)
            try self.validate(self.loadBalancerName, name: "loadBalancerName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case certificateAlternativeNames = "certificateAlternativeNames"
            case certificateDomainName = "certificateDomainName"
            case certificateName = "certificateName"
            case healthCheckPath = "healthCheckPath"
            case instancePort = "instancePort"
            case ipAddressType = "ipAddressType"
            case loadBalancerName = "loadBalancerName"
            case tags = "tags"
            case tlsPolicyName = "tlsPolicyName"
        }
    }

    public struct CreateLoadBalancerResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct CreateLoadBalancerTlsCertificateRequest: AWSEncodableShape {
        /// An array of strings listing alternative domains and subdomains for your SSL/TLS certificate. Lightsail will de-dupe the names for you. You can have a maximum of 9 alternative names (in addition to the 1 primary domain). We do not support wildcards (*.example.com).
        public let certificateAlternativeNames: [String]?
        /// The domain name (example.com) for your SSL/TLS certificate.
        public let certificateDomainName: String
        /// The SSL/TLS certificate name. You can have up to 10 certificates in your account at one time. Each Lightsail load balancer can have up to 2 certificates associated with it at one time. There is also an overall limit to the number of certificates that can be issue in a 365-day period. For more information, see Limits.
        public let certificateName: String
        /// The load balancer name where you want to create the SSL/TLS certificate.
        public let loadBalancerName: String
        /// The tag keys and optional values to add to the resource during create. Use the TagResource action to tag a resource after it's created.
        public let tags: [Tag]?

        @inlinable
        public init(certificateAlternativeNames: [String]? = nil, certificateDomainName: String, certificateName: String, loadBalancerName: String, tags: [Tag]? = nil) {
            self.certificateAlternativeNames = certificateAlternativeNames
            self.certificateDomainName = certificateDomainName
            self.certificateName = certificateName
            self.loadBalancerName = loadBalancerName
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.certificateName, name: "certificateName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.loadBalancerName, name: "loadBalancerName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case certificateAlternativeNames = "certificateAlternativeNames"
            case certificateDomainName = "certificateDomainName"
            case certificateName = "certificateName"
            case loadBalancerName = "loadBalancerName"
            case tags = "tags"
        }
    }

    public struct CreateLoadBalancerTlsCertificateResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct CreateRelationalDatabaseFromSnapshotRequest: AWSEncodableShape {
        /// The Availability Zone in which to create your new database. Use the us-east-2a case-sensitive format. You can get a list of Availability Zones by using the get regions operation. Be sure to add the include relational database Availability Zones parameter to your request.
        public let availabilityZone: String?
        /// Specifies the accessibility options for your new database. A value of true specifies a database that is available to resources outside of your Lightsail account. A value of false specifies a database that is available only to your Lightsail resources in the same region as your database.
        public let publiclyAccessible: Bool?
        /// The bundle ID for your new database. A bundle describes the performance specifications for your database. You can get a list of database bundle IDs by using the get relational database bundles operation. When creating a new database from a snapshot, you cannot choose a bundle that is smaller than the bundle of the source database.
        public let relationalDatabaseBundleId: String?
        /// The name to use for your new Lightsail database resource. Constraints:   Must contain from 2 to 255 alphanumeric characters, or hyphens.   The first and last character must be a letter or number.
        public let relationalDatabaseName: String
        /// The name of the database snapshot from which to create your new database.
        public let relationalDatabaseSnapshotName: String?
        /// The date and time to restore your database from. Constraints:   Must be before the latest restorable time for the database.   Cannot be specified if the use latest restorable time parameter is true.   Specified in Coordinated Universal Time (UTC).   Specified in the Unix time format. For example, if you wish to use a restore time of October 1, 2018, at 8 PM UTC, then you input 1538424000 as the restore time.
        public let restoreTime: Date?
        /// The name of the source database.
        public let sourceRelationalDatabaseName: String?
        /// The tag keys and optional values to add to the resource during create. Use the TagResource action to tag a resource after it's created.
        public let tags: [Tag]?
        /// Specifies whether your database is restored from the latest backup time. A value of true restores from the latest backup time.  Default: false  Constraints: Cannot be specified if the restore time parameter is provided.
        public let useLatestRestorableTime: Bool?

        @inlinable
        public init(availabilityZone: String? = nil, publiclyAccessible: Bool? = nil, relationalDatabaseBundleId: String? = nil, relationalDatabaseName: String, relationalDatabaseSnapshotName: String? = nil, restoreTime: Date? = nil, sourceRelationalDatabaseName: String? = nil, tags: [Tag]? = nil, useLatestRestorableTime: Bool? = nil) {
            self.availabilityZone = availabilityZone
            self.publiclyAccessible = publiclyAccessible
            self.relationalDatabaseBundleId = relationalDatabaseBundleId
            self.relationalDatabaseName = relationalDatabaseName
            self.relationalDatabaseSnapshotName = relationalDatabaseSnapshotName
            self.restoreTime = restoreTime
            self.sourceRelationalDatabaseName = sourceRelationalDatabaseName
            self.tags = tags
            self.useLatestRestorableTime = useLatestRestorableTime
        }

        public func validate(name: String) throws {
            try self.validate(self.relationalDatabaseName, name: "relationalDatabaseName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.relationalDatabaseSnapshotName, name: "relationalDatabaseSnapshotName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.sourceRelationalDatabaseName, name: "sourceRelationalDatabaseName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case availabilityZone = "availabilityZone"
            case publiclyAccessible = "publiclyAccessible"
            case relationalDatabaseBundleId = "relationalDatabaseBundleId"
            case relationalDatabaseName = "relationalDatabaseName"
            case relationalDatabaseSnapshotName = "relationalDatabaseSnapshotName"
            case restoreTime = "restoreTime"
            case sourceRelationalDatabaseName = "sourceRelationalDatabaseName"
            case tags = "tags"
            case useLatestRestorableTime = "useLatestRestorableTime"
        }
    }

    public struct CreateRelationalDatabaseFromSnapshotResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct CreateRelationalDatabaseRequest: AWSEncodableShape {
        /// The Availability Zone in which to create your new database. Use the us-east-2a case-sensitive format. You can get a list of Availability Zones by using the get regions operation. Be sure to add the include relational database Availability Zones parameter to your request.
        public let availabilityZone: String?
        /// The meaning of this parameter differs according to the database engine you use.  MySQL  The name of the database to create when the Lightsail database resource is created. If this parameter isn't specified, no database is created in the database resource. Constraints:   Must contain 1 to 64 letters or numbers.   Must begin with a letter. Subsequent characters can be letters, underscores, or digits (0- 9).   Can't be a word reserved by the specified database engine. For more information about reserved words in MySQL, see the Keywords and Reserved Words articles for MySQL 5.6, MySQL 5.7, and MySQL 8.0.    PostgreSQL  The name of the database to create when the Lightsail database resource is created. If this parameter isn't specified, a database named postgres is created in the database resource. Constraints:   Must contain 1 to 63 letters or numbers.   Must begin with a letter. Subsequent characters can be letters, underscores, or digits (0- 9).   Can't be a word reserved by the specified database engine. For more information about reserved words in PostgreSQL, see the SQL Key Words articles for PostgreSQL 9.6, PostgreSQL 10, PostgreSQL 11, and PostgreSQL 12.
        public let masterDatabaseName: String
        /// The name for the master user.  MySQL  Constraints:   Required for MySQL.   Must be 1 to 16 letters or numbers. Can contain underscores.   First character must be a letter.   Can't be a reserved word for the chosen database engine. For more information about reserved words in MySQL 5.6 or 5.7, see the Keywords and Reserved Words articles for MySQL 5.6, MySQL 5.7, or MySQL 8.0.    PostgreSQL  Constraints:   Required for PostgreSQL.   Must be 1 to 63 letters or numbers. Can contain underscores.   First character must be a letter.   Can't be a reserved word for the chosen database engine. For more information about reserved words in MySQL 5.6 or 5.7, see the Keywords and Reserved Words articles for PostgreSQL 9.6, PostgreSQL 10, PostgreSQL 11, and PostgreSQL 12.
        public let masterUsername: String
        /// The password for the master user. The password can include any printable ASCII character except "/", """, or "@". It cannot contain spaces.  MySQL  Constraints: Must contain from 8 to 41 characters.  PostgreSQL  Constraints: Must contain from 8 to 128 characters.
        public let masterUserPassword: String?
        /// The daily time range during which automated backups are created for your new database if automated backups are enabled. The default is a 30-minute window selected at random from an 8-hour block of time for each AWS Region. For more information about the preferred backup window time blocks for each region, see the Working With Backups guide in the Amazon Relational Database Service documentation. Constraints:   Must be in the hh24:mi-hh24:mi format. Example: 16:00-16:30    Specified in Coordinated Universal Time (UTC).   Must not conflict with the preferred maintenance window.   Must be at least 30 minutes.
        public let preferredBackupWindow: String?
        /// The weekly time range during which system maintenance can occur on your new database. The default is a 30-minute window selected at random from an 8-hour block of time for each AWS Region, occurring on a random day of the week. Constraints:   Must be in the ddd:hh24:mi-ddd:hh24:mi format.   Valid days: Mon, Tue, Wed, Thu, Fri, Sat, Sun.   Must be at least 30 minutes.   Specified in Coordinated Universal Time (UTC).   Example: Tue:17:00-Tue:17:30
        public let preferredMaintenanceWindow: String?
        /// Specifies the accessibility options for your new database. A value of true specifies a database that is available to resources outside of your Lightsail account. A value of false specifies a database that is available only to your Lightsail resources in the same region as your database.
        public let publiclyAccessible: Bool?
        /// The blueprint ID for your new database. A blueprint describes the major engine version of a database. You can get a list of database blueprints IDs by using the get relational database blueprints operation.
        public let relationalDatabaseBlueprintId: String
        /// The bundle ID for your new database. A bundle describes the performance specifications for your database. You can get a list of database bundle IDs by using the get relational database bundles operation.
        public let relationalDatabaseBundleId: String
        /// The name to use for your new Lightsail database resource. Constraints:   Must contain from 2 to 255 alphanumeric characters, or hyphens.   The first and last character must be a letter or number.
        public let relationalDatabaseName: String
        /// The tag keys and optional values to add to the resource during create. Use the TagResource action to tag a resource after it's created.
        public let tags: [Tag]?

        @inlinable
        public init(availabilityZone: String? = nil, masterDatabaseName: String, masterUsername: String, masterUserPassword: String? = nil, preferredBackupWindow: String? = nil, preferredMaintenanceWindow: String? = nil, publiclyAccessible: Bool? = nil, relationalDatabaseBlueprintId: String, relationalDatabaseBundleId: String, relationalDatabaseName: String, tags: [Tag]? = nil) {
            self.availabilityZone = availabilityZone
            self.masterDatabaseName = masterDatabaseName
            self.masterUsername = masterUsername
            self.masterUserPassword = masterUserPassword
            self.preferredBackupWindow = preferredBackupWindow
            self.preferredMaintenanceWindow = preferredMaintenanceWindow
            self.publiclyAccessible = publiclyAccessible
            self.relationalDatabaseBlueprintId = relationalDatabaseBlueprintId
            self.relationalDatabaseBundleId = relationalDatabaseBundleId
            self.relationalDatabaseName = relationalDatabaseName
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.relationalDatabaseName, name: "relationalDatabaseName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case availabilityZone = "availabilityZone"
            case masterDatabaseName = "masterDatabaseName"
            case masterUsername = "masterUsername"
            case masterUserPassword = "masterUserPassword"
            case preferredBackupWindow = "preferredBackupWindow"
            case preferredMaintenanceWindow = "preferredMaintenanceWindow"
            case publiclyAccessible = "publiclyAccessible"
            case relationalDatabaseBlueprintId = "relationalDatabaseBlueprintId"
            case relationalDatabaseBundleId = "relationalDatabaseBundleId"
            case relationalDatabaseName = "relationalDatabaseName"
            case tags = "tags"
        }
    }

    public struct CreateRelationalDatabaseResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct CreateRelationalDatabaseSnapshotRequest: AWSEncodableShape {
        /// The name of the database on which to base your new snapshot.
        public let relationalDatabaseName: String
        /// The name for your new database snapshot. Constraints:   Must contain from 2 to 255 alphanumeric characters, or hyphens.   The first and last character must be a letter or number.
        public let relationalDatabaseSnapshotName: String
        /// The tag keys and optional values to add to the resource during create. Use the TagResource action to tag a resource after it's created.
        public let tags: [Tag]?

        @inlinable
        public init(relationalDatabaseName: String, relationalDatabaseSnapshotName: String, tags: [Tag]? = nil) {
            self.relationalDatabaseName = relationalDatabaseName
            self.relationalDatabaseSnapshotName = relationalDatabaseSnapshotName
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.relationalDatabaseName, name: "relationalDatabaseName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.relationalDatabaseSnapshotName, name: "relationalDatabaseSnapshotName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case relationalDatabaseName = "relationalDatabaseName"
            case relationalDatabaseSnapshotName = "relationalDatabaseSnapshotName"
            case tags = "tags"
        }
    }

    public struct CreateRelationalDatabaseSnapshotResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct DeleteAlarmRequest: AWSEncodableShape {
        /// The name of the alarm to delete.
        public let alarmName: String

        @inlinable
        public init(alarmName: String) {
            self.alarmName = alarmName
        }

        public func validate(name: String) throws {
            try self.validate(self.alarmName, name: "alarmName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case alarmName = "alarmName"
        }
    }

    public struct DeleteAlarmResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct DeleteAutoSnapshotRequest: AWSEncodableShape {
        /// The date of the automatic snapshot to delete in YYYY-MM-DD format. Use the get auto snapshots operation to get the available automatic snapshots for a resource.
        public let date: String
        /// The name of the source instance or disk from which to delete the automatic snapshot.
        public let resourceName: String

        @inlinable
        public init(date: String, resourceName: String) {
            self.date = date
            self.resourceName = resourceName
        }

        public func validate(name: String) throws {
            try self.validate(self.date, name: "date", parent: name, pattern: "^[0-9]{4}-[0-9]{2}-[0-9]{2}$")
            try self.validate(self.resourceName, name: "resourceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case date = "date"
            case resourceName = "resourceName"
        }
    }

    public struct DeleteAutoSnapshotResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct DeleteBucketAccessKeyRequest: AWSEncodableShape {
        /// The ID of the access key to delete. Use the GetBucketAccessKeys action to get a list of access key IDs that you can specify.
        public let accessKeyId: String
        /// The name of the bucket that the access key belongs to.
        public let bucketName: String

        @inlinable
        public init(accessKeyId: String, bucketName: String) {
            self.accessKeyId = accessKeyId
            self.bucketName = bucketName
        }

        public func validate(name: String) throws {
            try self.validate(self.accessKeyId, name: "accessKeyId", parent: name, pattern: "\\S")
            try self.validate(self.bucketName, name: "bucketName", parent: name, max: 54)
            try self.validate(self.bucketName, name: "bucketName", parent: name, min: 3)
            try self.validate(self.bucketName, name: "bucketName", parent: name, pattern: "^[a-z0-9][a-z0-9-]{1,52}[a-z0-9]$")
        }

        private enum CodingKeys: String, CodingKey {
            case accessKeyId = "accessKeyId"
            case bucketName = "bucketName"
        }
    }

    public struct DeleteBucketAccessKeyResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct DeleteBucketRequest: AWSEncodableShape {
        /// The name of the bucket to delete. Use the GetBuckets action to get a list of bucket names that you can specify.
        public let bucketName: String
        /// A Boolean value that indicates whether to force delete the bucket. You must force delete the bucket if it has one of the following conditions:   The bucket is the origin of a distribution.   The bucket has instances that were granted access to it using the SetResourceAccessForBucket action.   The bucket has objects.   The bucket has access keys.    Force deleting a bucket might impact other resources that rely on the bucket, such as instances, distributions, or software that use the issued access keys.
        public let forceDelete: Bool?

        @inlinable
        public init(bucketName: String, forceDelete: Bool? = nil) {
            self.bucketName = bucketName
            self.forceDelete = forceDelete
        }

        public func validate(name: String) throws {
            try self.validate(self.bucketName, name: "bucketName", parent: name, max: 54)
            try self.validate(self.bucketName, name: "bucketName", parent: name, min: 3)
            try self.validate(self.bucketName, name: "bucketName", parent: name, pattern: "^[a-z0-9][a-z0-9-]{1,52}[a-z0-9]$")
        }

        private enum CodingKeys: String, CodingKey {
            case bucketName = "bucketName"
            case forceDelete = "forceDelete"
        }
    }

    public struct DeleteBucketResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct DeleteCertificateRequest: AWSEncodableShape {
        /// The name of the certificate to delete. Use the GetCertificates action to get a list of certificate names that you can specify.
        public let certificateName: String

        @inlinable
        public init(certificateName: String) {
            self.certificateName = certificateName
        }

        private enum CodingKeys: String, CodingKey {
            case certificateName = "certificateName"
        }
    }

    public struct DeleteCertificateResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct DeleteContactMethodRequest: AWSEncodableShape {
        /// The protocol that will be deleted, such as Email or SMS (text messaging).  To delete an Email and an SMS contact method if you added both, you must run separate DeleteContactMethod actions to delete each protocol.
        public let `protocol`: ContactProtocol

        @inlinable
        public init(protocol: ContactProtocol) {
            self.`protocol` = `protocol`
        }

        private enum CodingKeys: String, CodingKey {
            case `protocol` = "protocol"
        }
    }

    public struct DeleteContactMethodResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct DeleteContainerImageRequest: AWSEncodableShape {
        /// The name of the container image to delete from the container service. Use the GetContainerImages action to get the name of the container images that are registered to a container service.  Container images sourced from your Lightsail container service, that are registered and stored on your service, start with a colon (:). For example, :container-service-1.mystaticwebsite.1. Container images sourced from a public registry like Docker Hub don't start with a colon. For example, nginx:latest or nginx.
        public let image: String
        /// The name of the container service for which to delete a registered container image.
        public let serviceName: String

        @inlinable
        public init(image: String, serviceName: String) {
            self.image = image
            self.serviceName = serviceName
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            _ = encoder.container(keyedBy: CodingKeys.self)
            request.encodePath(self.image, key: "image")
            request.encodePath(self.serviceName, key: "serviceName")
        }

        public func validate(name: String) throws {
            try self.validate(self.serviceName, name: "serviceName", parent: name, max: 63)
            try self.validate(self.serviceName, name: "serviceName", parent: name, min: 1)
            try self.validate(self.serviceName, name: "serviceName", parent: name, pattern: "^[a-z0-9]{1,2}|[a-z0-9][a-z0-9-]+[a-z0-9]$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct DeleteContainerImageResult: AWSDecodableShape {
        public init() {}
    }

    public struct DeleteContainerServiceRequest: AWSEncodableShape {
        /// The name of the container service to delete.
        public let serviceName: String

        @inlinable
        public init(serviceName: String) {
            self.serviceName = serviceName
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            _ = encoder.container(keyedBy: CodingKeys.self)
            request.encodePath(self.serviceName, key: "serviceName")
        }

        public func validate(name: String) throws {
            try self.validate(self.serviceName, name: "serviceName", parent: name, max: 63)
            try self.validate(self.serviceName, name: "serviceName", parent: name, min: 1)
            try self.validate(self.serviceName, name: "serviceName", parent: name, pattern: "^[a-z0-9]{1,2}|[a-z0-9][a-z0-9-]+[a-z0-9]$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct DeleteContainerServiceResult: AWSDecodableShape {
        public init() {}
    }

    public struct DeleteDiskRequest: AWSEncodableShape {
        /// The unique name of the disk you want to delete (my-disk).
        public let diskName: String
        /// A Boolean value to indicate whether to delete all add-ons for the disk.
        public let forceDeleteAddOns: Bool?

        @inlinable
        public init(diskName: String, forceDeleteAddOns: Bool? = nil) {
            self.diskName = diskName
            self.forceDeleteAddOns = forceDeleteAddOns
        }

        public func validate(name: String) throws {
            try self.validate(self.diskName, name: "diskName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case diskName = "diskName"
            case forceDeleteAddOns = "forceDeleteAddOns"
        }
    }

    public struct DeleteDiskResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct DeleteDiskSnapshotRequest: AWSEncodableShape {
        /// The name of the disk snapshot you want to delete (my-disk-snapshot).
        public let diskSnapshotName: String

        @inlinable
        public init(diskSnapshotName: String) {
            self.diskSnapshotName = diskSnapshotName
        }

        public func validate(name: String) throws {
            try self.validate(self.diskSnapshotName, name: "diskSnapshotName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case diskSnapshotName = "diskSnapshotName"
        }
    }

    public struct DeleteDiskSnapshotResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct DeleteDistributionRequest: AWSEncodableShape {
        /// The name of the distribution to delete. Use the GetDistributions action to get a list of distribution names that you can specify.
        public let distributionName: String?

        @inlinable
        public init(distributionName: String? = nil) {
            self.distributionName = distributionName
        }

        public func validate(name: String) throws {
            try self.validate(self.distributionName, name: "distributionName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case distributionName = "distributionName"
        }
    }

    public struct DeleteDistributionResult: AWSDecodableShape {
        /// An object that describes the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operation: Operation?

        @inlinable
        public init(operation: Operation? = nil) {
            self.operation = operation
        }

        private enum CodingKeys: String, CodingKey {
            case operation = "operation"
        }
    }

    public struct DeleteDomainEntryRequest: AWSEncodableShape {
        /// An array of key-value pairs containing information about your domain entries.
        public let domainEntry: DomainEntry
        /// The name of the domain entry to delete.
        public let domainName: String

        @inlinable
        public init(domainEntry: DomainEntry, domainName: String) {
            self.domainEntry = domainEntry
            self.domainName = domainName
        }

        public func validate(name: String) throws {
            try self.domainEntry.validate(name: "\(name).domainEntry")
        }

        private enum CodingKeys: String, CodingKey {
            case domainEntry = "domainEntry"
            case domainName = "domainName"
        }
    }

    public struct DeleteDomainEntryResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operation: Operation?

        @inlinable
        public init(operation: Operation? = nil) {
            self.operation = operation
        }

        private enum CodingKeys: String, CodingKey {
            case operation = "operation"
        }
    }

    public struct DeleteDomainRequest: AWSEncodableShape {
        /// The specific domain name to delete.
        public let domainName: String

        @inlinable
        public init(domainName: String) {
            self.domainName = domainName
        }

        private enum CodingKeys: String, CodingKey {
            case domainName = "domainName"
        }
    }

    public struct DeleteDomainResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operation: Operation?

        @inlinable
        public init(operation: Operation? = nil) {
            self.operation = operation
        }

        private enum CodingKeys: String, CodingKey {
            case operation = "operation"
        }
    }

    public struct DeleteInstanceRequest: AWSEncodableShape {
        /// A Boolean value to indicate whether to delete all add-ons for the instance.
        public let forceDeleteAddOns: Bool?
        /// The name of the instance to delete.
        public let instanceName: String

        @inlinable
        public init(forceDeleteAddOns: Bool? = nil, instanceName: String) {
            self.forceDeleteAddOns = forceDeleteAddOns
            self.instanceName = instanceName
        }

        public func validate(name: String) throws {
            try self.validate(self.instanceName, name: "instanceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case forceDeleteAddOns = "forceDeleteAddOns"
            case instanceName = "instanceName"
        }
    }

    public struct DeleteInstanceResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct DeleteInstanceSnapshotRequest: AWSEncodableShape {
        /// The name of the snapshot to delete.
        public let instanceSnapshotName: String

        @inlinable
        public init(instanceSnapshotName: String) {
            self.instanceSnapshotName = instanceSnapshotName
        }

        public func validate(name: String) throws {
            try self.validate(self.instanceSnapshotName, name: "instanceSnapshotName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case instanceSnapshotName = "instanceSnapshotName"
        }
    }

    public struct DeleteInstanceSnapshotResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct DeleteKeyPairRequest: AWSEncodableShape {
        /// The RSA fingerprint of the Lightsail default key pair to delete.  The expectedFingerprint parameter is required only when specifying to delete a Lightsail default key pair.
        public let expectedFingerprint: String?
        /// The name of the key pair to delete.
        public let keyPairName: String

        @inlinable
        public init(expectedFingerprint: String? = nil, keyPairName: String) {
            self.expectedFingerprint = expectedFingerprint
            self.keyPairName = keyPairName
        }

        public func validate(name: String) throws {
            try self.validate(self.keyPairName, name: "keyPairName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case expectedFingerprint = "expectedFingerprint"
            case keyPairName = "keyPairName"
        }
    }

    public struct DeleteKeyPairResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operation: Operation?

        @inlinable
        public init(operation: Operation? = nil) {
            self.operation = operation
        }

        private enum CodingKeys: String, CodingKey {
            case operation = "operation"
        }
    }

    public struct DeleteKnownHostKeysRequest: AWSEncodableShape {
        /// The name of the instance for which you want to reset the host key or certificate.
        public let instanceName: String

        @inlinable
        public init(instanceName: String) {
            self.instanceName = instanceName
        }

        public func validate(name: String) throws {
            try self.validate(self.instanceName, name: "instanceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case instanceName = "instanceName"
        }
    }

    public struct DeleteKnownHostKeysResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct DeleteLoadBalancerRequest: AWSEncodableShape {
        /// The name of the load balancer you want to delete.
        public let loadBalancerName: String

        @inlinable
        public init(loadBalancerName: String) {
            self.loadBalancerName = loadBalancerName
        }

        public func validate(name: String) throws {
            try self.validate(self.loadBalancerName, name: "loadBalancerName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancerName = "loadBalancerName"
        }
    }

    public struct DeleteLoadBalancerResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct DeleteLoadBalancerTlsCertificateRequest: AWSEncodableShape {
        /// The SSL/TLS certificate name.
        public let certificateName: String
        /// When true, forces the deletion of an SSL/TLS certificate. There can be two certificates associated with a Lightsail load balancer: the primary and the backup. The force parameter is required when the primary SSL/TLS certificate is in use by an instance attached to the load balancer.
        public let force: Bool?
        /// The load balancer name.
        public let loadBalancerName: String

        @inlinable
        public init(certificateName: String, force: Bool? = nil, loadBalancerName: String) {
            self.certificateName = certificateName
            self.force = force
            self.loadBalancerName = loadBalancerName
        }

        public func validate(name: String) throws {
            try self.validate(self.certificateName, name: "certificateName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.loadBalancerName, name: "loadBalancerName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case certificateName = "certificateName"
            case force = "force"
            case loadBalancerName = "loadBalancerName"
        }
    }

    public struct DeleteLoadBalancerTlsCertificateResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct DeleteRelationalDatabaseRequest: AWSEncodableShape {
        /// The name of the database snapshot created if skip final snapshot is false, which is the default value for that parameter.  Specifying this parameter and also specifying the skip final snapshot parameter to true results in an error.  Constraints:   Must contain from 2 to 255 alphanumeric characters, or hyphens.   The first and last character must be a letter or number.
        public let finalRelationalDatabaseSnapshotName: String?
        /// The name of the database that you are deleting.
        public let relationalDatabaseName: String
        /// Determines whether a final database snapshot is created before your database is deleted. If true is specified, no database snapshot is created. If false is specified, a database snapshot is created before your database is deleted. You must specify the final relational database snapshot name parameter if the skip final snapshot parameter is false. Default: false
        public let skipFinalSnapshot: Bool?

        @inlinable
        public init(finalRelationalDatabaseSnapshotName: String? = nil, relationalDatabaseName: String, skipFinalSnapshot: Bool? = nil) {
            self.finalRelationalDatabaseSnapshotName = finalRelationalDatabaseSnapshotName
            self.relationalDatabaseName = relationalDatabaseName
            self.skipFinalSnapshot = skipFinalSnapshot
        }

        public func validate(name: String) throws {
            try self.validate(self.finalRelationalDatabaseSnapshotName, name: "finalRelationalDatabaseSnapshotName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.relationalDatabaseName, name: "relationalDatabaseName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case finalRelationalDatabaseSnapshotName = "finalRelationalDatabaseSnapshotName"
            case relationalDatabaseName = "relationalDatabaseName"
            case skipFinalSnapshot = "skipFinalSnapshot"
        }
    }

    public struct DeleteRelationalDatabaseResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct DeleteRelationalDatabaseSnapshotRequest: AWSEncodableShape {
        /// The name of the database snapshot that you are deleting.
        public let relationalDatabaseSnapshotName: String

        @inlinable
        public init(relationalDatabaseSnapshotName: String) {
            self.relationalDatabaseSnapshotName = relationalDatabaseSnapshotName
        }

        public func validate(name: String) throws {
            try self.validate(self.relationalDatabaseSnapshotName, name: "relationalDatabaseSnapshotName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case relationalDatabaseSnapshotName = "relationalDatabaseSnapshotName"
        }
    }

    public struct DeleteRelationalDatabaseSnapshotResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct DestinationInfo: AWSDecodableShape {
        /// The ID of the resource created at the destination.
        public let id: String?
        /// The destination service of the record.
        public let service: String?

        @inlinable
        public init(id: String? = nil, service: String? = nil) {
            self.id = id
            self.service = service
        }

        private enum CodingKeys: String, CodingKey {
            case id = "id"
            case service = "service"
        }
    }

    public struct DetachCertificateFromDistributionRequest: AWSEncodableShape {
        /// The name of the distribution from which to detach the certificate. Use the GetDistributions action to get a list of distribution names that you can specify.
        public let distributionName: String

        @inlinable
        public init(distributionName: String) {
            self.distributionName = distributionName
        }

        public func validate(name: String) throws {
            try self.validate(self.distributionName, name: "distributionName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case distributionName = "distributionName"
        }
    }

    public struct DetachCertificateFromDistributionResult: AWSDecodableShape {
        /// An object that describes the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operation: Operation?

        @inlinable
        public init(operation: Operation? = nil) {
            self.operation = operation
        }

        private enum CodingKeys: String, CodingKey {
            case operation = "operation"
        }
    }

    public struct DetachDiskRequest: AWSEncodableShape {
        /// The unique name of the disk you want to detach from your instance (my-disk).
        public let diskName: String

        @inlinable
        public init(diskName: String) {
            self.diskName = diskName
        }

        public func validate(name: String) throws {
            try self.validate(self.diskName, name: "diskName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case diskName = "diskName"
        }
    }

    public struct DetachDiskResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct DetachInstancesFromLoadBalancerRequest: AWSEncodableShape {
        /// An array of strings containing the names of the instances you want to detach from the load balancer.
        public let instanceNames: [String]
        /// The name of the Lightsail load balancer.
        public let loadBalancerName: String

        @inlinable
        public init(instanceNames: [String], loadBalancerName: String) {
            self.instanceNames = instanceNames
            self.loadBalancerName = loadBalancerName
        }

        public func validate(name: String) throws {
            try self.instanceNames.forEach {
                try validate($0, name: "instanceNames[]", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            }
            try self.validate(self.loadBalancerName, name: "loadBalancerName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case instanceNames = "instanceNames"
            case loadBalancerName = "loadBalancerName"
        }
    }

    public struct DetachInstancesFromLoadBalancerResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct DetachStaticIpRequest: AWSEncodableShape {
        /// The name of the static IP to detach from the instance.
        public let staticIpName: String

        @inlinable
        public init(staticIpName: String) {
            self.staticIpName = staticIpName
        }

        public func validate(name: String) throws {
            try self.validate(self.staticIpName, name: "staticIpName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case staticIpName = "staticIpName"
        }
    }

    public struct DetachStaticIpResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct DisableAddOnRequest: AWSEncodableShape {
        /// The add-on type to disable.
        public let addOnType: AddOnType
        /// The name of the source resource for which to disable the add-on.
        public let resourceName: String

        @inlinable
        public init(addOnType: AddOnType, resourceName: String) {
            self.addOnType = addOnType
            self.resourceName = resourceName
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceName, name: "resourceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case addOnType = "addOnType"
            case resourceName = "resourceName"
        }
    }

    public struct DisableAddOnResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct Disk: AWSDecodableShape {
        /// An array of objects representing the add-ons enabled on the disk.
        public let addOns: [AddOn]?
        /// The Amazon Resource Name (ARN) of the disk.
        public let arn: String?
        /// The resources to which the disk is attached.
        public let attachedTo: String?
        /// (Discontinued) The attachment state of the disk.  In releases prior to November 14, 2017, this parameter returned attached for system disks in the API response. It is now discontinued, but still included in the response. Use isAttached instead.
        public let attachmentState: String?
        /// The status of automatically mounting a storage disk to a virtual computer.  This parameter only applies to Lightsail for Research resources.
        public let autoMountStatus: AutoMountStatus?
        /// The date when the disk was created.
        public let createdAt: Date?
        /// (Discontinued) The number of GB in use by the disk.  In releases prior to November 14, 2017, this parameter was not included in the API response. It is now discontinued.
        public let gbInUse: Int?
        /// The input/output operations per second (IOPS) of the disk.
        public let iops: Int?
        /// A Boolean value indicating whether the disk is attached.
        public let isAttached: Bool?
        /// A Boolean value indicating whether this disk is a system disk (has an operating system loaded on it).
        public let isSystemDisk: Bool?
        /// The AWS Region and Availability Zone where the disk is located.
        public let location: ResourceLocation?
        /// The unique name of the disk.
        public let name: String?
        /// The disk path.
        public let path: String?
        /// The Lightsail resource type (Disk).
        public let resourceType: ResourceType?
        /// The size of the disk in GB.
        public let sizeInGb: Int?
        /// Describes the status of the disk.
        public let state: DiskState?
        /// The support code. Include this code in your email to support when you have questions about an instance or another resource in Lightsail. This code enables our support team to look up your Lightsail information more easily.
        public let supportCode: String?
        /// The tag keys and optional values for the resource. For more information about tags in Lightsail, see the Amazon Lightsail Developer Guide.
        public let tags: [Tag]?

        @inlinable
        public init(addOns: [AddOn]? = nil, arn: String? = nil, attachedTo: String? = nil, autoMountStatus: AutoMountStatus? = nil, createdAt: Date? = nil, iops: Int? = nil, isAttached: Bool? = nil, isSystemDisk: Bool? = nil, location: ResourceLocation? = nil, name: String? = nil, path: String? = nil, resourceType: ResourceType? = nil, sizeInGb: Int? = nil, state: DiskState? = nil, supportCode: String? = nil, tags: [Tag]? = nil) {
            self.addOns = addOns
            self.arn = arn
            self.attachedTo = attachedTo
            self.attachmentState = nil
            self.autoMountStatus = autoMountStatus
            self.createdAt = createdAt
            self.gbInUse = nil
            self.iops = iops
            self.isAttached = isAttached
            self.isSystemDisk = isSystemDisk
            self.location = location
            self.name = name
            self.path = path
            self.resourceType = resourceType
            self.sizeInGb = sizeInGb
            self.state = state
            self.supportCode = supportCode
            self.tags = tags
        }

        @available(*, deprecated, message: "Members attachmentState, gbInUse have been deprecated")
        @inlinable
        public init(addOns: [AddOn]? = nil, arn: String? = nil, attachedTo: String? = nil, attachmentState: String? = nil, autoMountStatus: AutoMountStatus? = nil, createdAt: Date? = nil, gbInUse: Int? = nil, iops: Int? = nil, isAttached: Bool? = nil, isSystemDisk: Bool? = nil, location: ResourceLocation? = nil, name: String? = nil, path: String? = nil, resourceType: ResourceType? = nil, sizeInGb: Int? = nil, state: DiskState? = nil, supportCode: String? = nil, tags: [Tag]? = nil) {
            self.addOns = addOns
            self.arn = arn
            self.attachedTo = attachedTo
            self.attachmentState = attachmentState
            self.autoMountStatus = autoMountStatus
            self.createdAt = createdAt
            self.gbInUse = gbInUse
            self.iops = iops
            self.isAttached = isAttached
            self.isSystemDisk = isSystemDisk
            self.location = location
            self.name = name
            self.path = path
            self.resourceType = resourceType
            self.sizeInGb = sizeInGb
            self.state = state
            self.supportCode = supportCode
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case addOns = "addOns"
            case arn = "arn"
            case attachedTo = "attachedTo"
            case attachmentState = "attachmentState"
            case autoMountStatus = "autoMountStatus"
            case createdAt = "createdAt"
            case gbInUse = "gbInUse"
            case iops = "iops"
            case isAttached = "isAttached"
            case isSystemDisk = "isSystemDisk"
            case location = "location"
            case name = "name"
            case path = "path"
            case resourceType = "resourceType"
            case sizeInGb = "sizeInGb"
            case state = "state"
            case supportCode = "supportCode"
            case tags = "tags"
        }
    }

    public struct DiskInfo: AWSDecodableShape {
        /// A Boolean value indicating whether this disk is a system disk (has an operating system loaded on it).
        public let isSystemDisk: Bool?
        /// The disk name.
        public let name: String?
        /// The disk path.
        public let path: String?
        /// The size of the disk in GB (32).
        public let sizeInGb: Int?

        @inlinable
        public init(isSystemDisk: Bool? = nil, name: String? = nil, path: String? = nil, sizeInGb: Int? = nil) {
            self.isSystemDisk = isSystemDisk
            self.name = name
            self.path = path
            self.sizeInGb = sizeInGb
        }

        private enum CodingKeys: String, CodingKey {
            case isSystemDisk = "isSystemDisk"
            case name = "name"
            case path = "path"
            case sizeInGb = "sizeInGb"
        }
    }

    public struct DiskMap: AWSEncodableShape {
        /// The new disk name (my-new-disk).
        public let newDiskName: String?
        /// The original disk path exposed to the instance (for example, /dev/sdh).
        public let originalDiskPath: String?

        @inlinable
        public init(newDiskName: String? = nil, originalDiskPath: String? = nil) {
            self.newDiskName = newDiskName
            self.originalDiskPath = originalDiskPath
        }

        public func validate(name: String) throws {
            try self.validate(self.newDiskName, name: "newDiskName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.originalDiskPath, name: "originalDiskPath", parent: name, pattern: "\\S")
        }

        private enum CodingKeys: String, CodingKey {
            case newDiskName = "newDiskName"
            case originalDiskPath = "originalDiskPath"
        }
    }

    public struct DiskSnapshot: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the disk snapshot.
        public let arn: String?
        /// The date when the disk snapshot was created.
        public let createdAt: Date?
        /// The Amazon Resource Name (ARN) of the source disk from which the disk snapshot was created.
        public let fromDiskArn: String?
        /// The unique name of the source disk from which the disk snapshot was created.
        public let fromDiskName: String?
        /// The Amazon Resource Name (ARN) of the source instance from which the disk (system volume) snapshot was created.
        public let fromInstanceArn: String?
        /// The unique name of the source instance from which the disk (system volume) snapshot was created.
        public let fromInstanceName: String?
        /// A Boolean value indicating whether the snapshot was created from an automatic snapshot.
        public let isFromAutoSnapshot: Bool?
        /// The AWS Region and Availability Zone where the disk snapshot was created.
        public let location: ResourceLocation?
        /// The name of the disk snapshot (my-disk-snapshot).
        public let name: String?
        /// The progress of the snapshot.
        public let progress: String?
        /// The Lightsail resource type (DiskSnapshot).
        public let resourceType: ResourceType?
        /// The size of the disk in GB.
        public let sizeInGb: Int?
        /// The status of the disk snapshot operation.
        public let state: DiskSnapshotState?
        /// The support code. Include this code in your email to support when you have questions about an instance or another resource in Lightsail. This code enables our support team to look up your Lightsail information more easily.
        public let supportCode: String?
        /// The tag keys and optional values for the resource. For more information about tags in Lightsail, see the Amazon Lightsail Developer Guide.
        public let tags: [Tag]?

        @inlinable
        public init(arn: String? = nil, createdAt: Date? = nil, fromDiskArn: String? = nil, fromDiskName: String? = nil, fromInstanceArn: String? = nil, fromInstanceName: String? = nil, isFromAutoSnapshot: Bool? = nil, location: ResourceLocation? = nil, name: String? = nil, progress: String? = nil, resourceType: ResourceType? = nil, sizeInGb: Int? = nil, state: DiskSnapshotState? = nil, supportCode: String? = nil, tags: [Tag]? = nil) {
            self.arn = arn
            self.createdAt = createdAt
            self.fromDiskArn = fromDiskArn
            self.fromDiskName = fromDiskName
            self.fromInstanceArn = fromInstanceArn
            self.fromInstanceName = fromInstanceName
            self.isFromAutoSnapshot = isFromAutoSnapshot
            self.location = location
            self.name = name
            self.progress = progress
            self.resourceType = resourceType
            self.sizeInGb = sizeInGb
            self.state = state
            self.supportCode = supportCode
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "arn"
            case createdAt = "createdAt"
            case fromDiskArn = "fromDiskArn"
            case fromDiskName = "fromDiskName"
            case fromInstanceArn = "fromInstanceArn"
            case fromInstanceName = "fromInstanceName"
            case isFromAutoSnapshot = "isFromAutoSnapshot"
            case location = "location"
            case name = "name"
            case progress = "progress"
            case resourceType = "resourceType"
            case sizeInGb = "sizeInGb"
            case state = "state"
            case supportCode = "supportCode"
            case tags = "tags"
        }
    }

    public struct DiskSnapshotInfo: AWSDecodableShape {
        /// The size of the disk in GB (32).
        public let sizeInGb: Int?

        @inlinable
        public init(sizeInGb: Int? = nil) {
            self.sizeInGb = sizeInGb
        }

        private enum CodingKeys: String, CodingKey {
            case sizeInGb = "sizeInGb"
        }
    }

    public struct DistributionBundle: AWSDecodableShape {
        /// The ID of the bundle.
        public let bundleId: String?
        /// Indicates whether the bundle is active, and can be specified for a new or existing distribution.
        public let isActive: Bool?
        /// The name of the distribution bundle.
        public let name: String?
        /// The monthly price, in US dollars, of the bundle.
        public let price: Float?
        /// The monthly network transfer quota of the bundle.
        public let transferPerMonthInGb: Int?

        @inlinable
        public init(bundleId: String? = nil, isActive: Bool? = nil, name: String? = nil, price: Float? = nil, transferPerMonthInGb: Int? = nil) {
            self.bundleId = bundleId
            self.isActive = isActive
            self.name = name
            self.price = price
            self.transferPerMonthInGb = transferPerMonthInGb
        }

        private enum CodingKeys: String, CodingKey {
            case bundleId = "bundleId"
            case isActive = "isActive"
            case name = "name"
            case price = "price"
            case transferPerMonthInGb = "transferPerMonthInGb"
        }
    }

    public struct DnsRecordCreationState: AWSDecodableShape {
        /// The status code for the automated DNS record creation. Following are the possible values:    SUCCEEDED - The validation records were successfully added to the domain.    STARTED - The automatic DNS record creation has started.    FAILED - The validation records failed to be added to the domain.
        public let code: DnsRecordCreationStateCode?
        /// The message that describes the reason for the status code.
        public let message: String?

        @inlinable
        public init(code: DnsRecordCreationStateCode? = nil, message: String? = nil) {
            self.code = code
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "code"
            case message = "message"
        }
    }

    public struct Domain: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the domain recordset (arn:aws:lightsail:global:123456789101:Domain/824cede0-abc7-4f84-8dbc-12345EXAMPLE).
        public let arn: String?
        /// The date when the domain recordset was created.
        public let createdAt: Date?
        /// An array of key-value pairs containing information about the domain entries.
        public let domainEntries: [DomainEntry]?
        /// The AWS Region and Availability Zones where the domain recordset was created.
        public let location: ResourceLocation?
        /// The name of the domain.
        public let name: String?
        /// An object that describes the state of the Route 53 domain delegation to a Lightsail DNS zone.
        public let registeredDomainDelegationInfo: RegisteredDomainDelegationInfo?
        /// The resource type.
        public let resourceType: ResourceType?
        /// The support code. Include this code in your email to support when you have questions about an instance or another resource in Lightsail. This code enables our support team to look up your Lightsail information more easily.
        public let supportCode: String?
        /// The tag keys and optional values for the resource. For more information about tags in Lightsail, see the Amazon Lightsail Developer Guide.
        public let tags: [Tag]?

        @inlinable
        public init(arn: String? = nil, createdAt: Date? = nil, domainEntries: [DomainEntry]? = nil, location: ResourceLocation? = nil, name: String? = nil, registeredDomainDelegationInfo: RegisteredDomainDelegationInfo? = nil, resourceType: ResourceType? = nil, supportCode: String? = nil, tags: [Tag]? = nil) {
            self.arn = arn
            self.createdAt = createdAt
            self.domainEntries = domainEntries
            self.location = location
            self.name = name
            self.registeredDomainDelegationInfo = registeredDomainDelegationInfo
            self.resourceType = resourceType
            self.supportCode = supportCode
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "arn"
            case createdAt = "createdAt"
            case domainEntries = "domainEntries"
            case location = "location"
            case name = "name"
            case registeredDomainDelegationInfo = "registeredDomainDelegationInfo"
            case resourceType = "resourceType"
            case supportCode = "supportCode"
            case tags = "tags"
        }
    }

    public struct DomainEntry: AWSEncodableShape & AWSDecodableShape {
        /// The ID of the domain recordset entry.
        public let id: String?
        /// When true, specifies whether the domain entry is an alias used by the Lightsail load balancer, Lightsail container service, Lightsail content delivery network (CDN) distribution, or another Amazon Web Services resource. You can include an alias (A type) record in your request, which points to the DNS name of a load balancer, container service, CDN distribution, or other Amazon Web Services resource and routes traffic to that resource.
        public let isAlias: Bool?
        /// The name of the domain.
        public let name: String?
        /// (Discontinued) The options for the domain entry.  In releases prior to November 29, 2017, this parameter was not included in the API response. It is now discontinued.
        public let options: [String: String]?
        /// The target IP address (192.0.2.0), or AWS name server (ns-111.awsdns-22.com.). For Lightsail load balancers, the value looks like ab1234c56789c6b86aba6fb203d443bc-123456789.us-east-2.elb.amazonaws.com. For Lightsail distributions, the value looks like exampled1182ne.cloudfront.net. For Lightsail container services, the value looks like container-service-1.example23scljs.us-west-2.cs.amazonlightsail.com. Be sure to also set isAlias to true when setting up an A record for a Lightsail load balancer, distribution, or container service.
        public let target: String?
        /// The type of domain entry, such as address for IPv4 (A), address for IPv6 (AAAA), canonical name (CNAME), mail exchanger (MX), name server (NS), start of authority (SOA), service locator (SRV), or text (TXT). The following domain entry types can be used:    A     AAAA     CNAME     MX     NS     SOA     SRV     TXT
        public let type: String?

        @inlinable
        public init(id: String? = nil, isAlias: Bool? = nil, name: String? = nil, target: String? = nil, type: String? = nil) {
            self.id = id
            self.isAlias = isAlias
            self.name = name
            self.options = nil
            self.target = target
            self.type = type
        }

        @available(*, deprecated, message: "Members options have been deprecated")
        @inlinable
        public init(id: String? = nil, isAlias: Bool? = nil, name: String? = nil, options: [String: String]? = nil, target: String? = nil, type: String? = nil) {
            self.id = id
            self.isAlias = isAlias
            self.name = name
            self.options = options
            self.target = target
            self.type = type
        }

        public func validate(name: String) throws {
            try self.validate(self.id, name: "id", parent: name, pattern: "\\S")
        }

        private enum CodingKeys: String, CodingKey {
            case id = "id"
            case isAlias = "isAlias"
            case name = "name"
            case options = "options"
            case target = "target"
            case type = "type"
        }
    }

    public struct DomainValidationRecord: AWSDecodableShape {
        /// An object that describes the state of the canonical name (CNAME) records that are automatically added by Lightsail to the DNS of the domain to validate domain ownership.
        public let dnsRecordCreationState: DnsRecordCreationState?
        /// The domain name of the certificate validation record. For example, example.com or www.example.com.
        public let domainName: String?
        /// An object that describes the DNS records to add to your domain's DNS to validate it for the certificate.
        public let resourceRecord: ResourceRecord?
        /// The validation status of the record.
        public let validationStatus: CertificateDomainValidationStatus?

        @inlinable
        public init(dnsRecordCreationState: DnsRecordCreationState? = nil, domainName: String? = nil, resourceRecord: ResourceRecord? = nil, validationStatus: CertificateDomainValidationStatus? = nil) {
            self.dnsRecordCreationState = dnsRecordCreationState
            self.domainName = domainName
            self.resourceRecord = resourceRecord
            self.validationStatus = validationStatus
        }

        private enum CodingKeys: String, CodingKey {
            case dnsRecordCreationState = "dnsRecordCreationState"
            case domainName = "domainName"
            case resourceRecord = "resourceRecord"
            case validationStatus = "validationStatus"
        }
    }

    public struct DownloadDefaultKeyPairRequest: AWSEncodableShape {
        public init() {}
    }

    public struct DownloadDefaultKeyPairResult: AWSDecodableShape {
        /// The timestamp when the default key pair was created.
        public let createdAt: Date?
        /// A base64-encoded RSA private key.
        public let privateKeyBase64: String?
        /// A base64-encoded public key of the ssh-rsa type.
        public let publicKeyBase64: String?

        @inlinable
        public init(createdAt: Date? = nil, privateKeyBase64: String? = nil, publicKeyBase64: String? = nil) {
            self.createdAt = createdAt
            self.privateKeyBase64 = privateKeyBase64
            self.publicKeyBase64 = publicKeyBase64
        }

        private enum CodingKeys: String, CodingKey {
            case createdAt = "createdAt"
            case privateKeyBase64 = "privateKeyBase64"
            case publicKeyBase64 = "publicKeyBase64"
        }
    }

    public struct EnableAddOnRequest: AWSEncodableShape {
        /// An array of strings representing the add-on to enable or modify.
        public let addOnRequest: AddOnRequest
        /// The name of the source resource for which to enable or modify the add-on.
        public let resourceName: String

        @inlinable
        public init(addOnRequest: AddOnRequest, resourceName: String) {
            self.addOnRequest = addOnRequest
            self.resourceName = resourceName
        }

        public func validate(name: String) throws {
            try self.addOnRequest.validate(name: "\(name).addOnRequest")
            try self.validate(self.resourceName, name: "resourceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case addOnRequest = "addOnRequest"
            case resourceName = "resourceName"
        }
    }

    public struct EnableAddOnResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct EndpointRequest: AWSEncodableShape {
        /// The name of the container for the endpoint.
        public let containerName: String
        /// The port of the container to which traffic is forwarded to.
        public let containerPort: Int
        /// An object that describes the health check configuration of the container.
        public let healthCheck: ContainerServiceHealthCheckConfig?

        @inlinable
        public init(containerName: String, containerPort: Int, healthCheck: ContainerServiceHealthCheckConfig? = nil) {
            self.containerName = containerName
            self.containerPort = containerPort
            self.healthCheck = healthCheck
        }

        private enum CodingKeys: String, CodingKey {
            case containerName = "containerName"
            case containerPort = "containerPort"
            case healthCheck = "healthCheck"
        }
    }

    public struct EstimateByTime: AWSDecodableShape {
        /// The currency of the estimate in USD.
        public let currency: Currency?
        /// The unit of measurement that's used for the cost estimate.
        public let pricingUnit: PricingUnit?
        /// The period of time, in days, that an estimate covers. The period has a start date and an end date. The start date must come before the end date.
        public let timePeriod: TimePeriod?
        /// The number of pricing units used to calculate the total number of hours. For example, 1 unit equals 1 hour.
        public let unit: Double?
        /// The amount of cost or usage that's measured for the cost estimate.
        public let usageCost: Double?

        @inlinable
        public init(currency: Currency? = nil, pricingUnit: PricingUnit? = nil, timePeriod: TimePeriod? = nil, unit: Double? = nil, usageCost: Double? = nil) {
            self.currency = currency
            self.pricingUnit = pricingUnit
            self.timePeriod = timePeriod
            self.unit = unit
            self.usageCost = usageCost
        }

        private enum CodingKeys: String, CodingKey {
            case currency = "currency"
            case pricingUnit = "pricingUnit"
            case timePeriod = "timePeriod"
            case unit = "unit"
            case usageCost = "usageCost"
        }
    }

    public struct ExportSnapshotRecord: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the export snapshot record.
        public let arn: String?
        /// The date when the export snapshot record was created.
        public let createdAt: Date?
        /// A list of objects describing the destination of the export snapshot record.
        public let destinationInfo: DestinationInfo?
        /// The AWS Region and Availability Zone where the export snapshot record is located.
        public let location: ResourceLocation?
        /// The export snapshot record name.
        public let name: String?
        /// The Lightsail resource type (ExportSnapshotRecord).
        public let resourceType: ResourceType?
        /// A list of objects describing the source of the export snapshot record.
        public let sourceInfo: ExportSnapshotRecordSourceInfo?
        /// The state of the export snapshot record.
        public let state: RecordState?

        @inlinable
        public init(arn: String? = nil, createdAt: Date? = nil, destinationInfo: DestinationInfo? = nil, location: ResourceLocation? = nil, name: String? = nil, resourceType: ResourceType? = nil, sourceInfo: ExportSnapshotRecordSourceInfo? = nil, state: RecordState? = nil) {
            self.arn = arn
            self.createdAt = createdAt
            self.destinationInfo = destinationInfo
            self.location = location
            self.name = name
            self.resourceType = resourceType
            self.sourceInfo = sourceInfo
            self.state = state
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "arn"
            case createdAt = "createdAt"
            case destinationInfo = "destinationInfo"
            case location = "location"
            case name = "name"
            case resourceType = "resourceType"
            case sourceInfo = "sourceInfo"
            case state = "state"
        }
    }

    public struct ExportSnapshotRecordSourceInfo: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the source instance or disk snapshot.
        public let arn: String?
        /// The date when the source instance or disk snapshot was created.
        public let createdAt: Date?
        /// A list of objects describing a disk snapshot.
        public let diskSnapshotInfo: DiskSnapshotInfo?
        /// The Amazon Resource Name (ARN) of the snapshot's source instance or disk.
        public let fromResourceArn: String?
        /// The name of the snapshot's source instance or disk.
        public let fromResourceName: String?
        /// A list of objects describing an instance snapshot.
        public let instanceSnapshotInfo: InstanceSnapshotInfo?
        /// The name of the source instance or disk snapshot.
        public let name: String?
        /// The Lightsail resource type (InstanceSnapshot or DiskSnapshot).
        public let resourceType: ExportSnapshotRecordSourceType?

        @inlinable
        public init(arn: String? = nil, createdAt: Date? = nil, diskSnapshotInfo: DiskSnapshotInfo? = nil, fromResourceArn: String? = nil, fromResourceName: String? = nil, instanceSnapshotInfo: InstanceSnapshotInfo? = nil, name: String? = nil, resourceType: ExportSnapshotRecordSourceType? = nil) {
            self.arn = arn
            self.createdAt = createdAt
            self.diskSnapshotInfo = diskSnapshotInfo
            self.fromResourceArn = fromResourceArn
            self.fromResourceName = fromResourceName
            self.instanceSnapshotInfo = instanceSnapshotInfo
            self.name = name
            self.resourceType = resourceType
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "arn"
            case createdAt = "createdAt"
            case diskSnapshotInfo = "diskSnapshotInfo"
            case fromResourceArn = "fromResourceArn"
            case fromResourceName = "fromResourceName"
            case instanceSnapshotInfo = "instanceSnapshotInfo"
            case name = "name"
            case resourceType = "resourceType"
        }
    }

    public struct ExportSnapshotRequest: AWSEncodableShape {
        /// The name of the instance or disk snapshot to be exported to Amazon EC2.
        public let sourceSnapshotName: String

        @inlinable
        public init(sourceSnapshotName: String) {
            self.sourceSnapshotName = sourceSnapshotName
        }

        public func validate(name: String) throws {
            try self.validate(self.sourceSnapshotName, name: "sourceSnapshotName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case sourceSnapshotName = "sourceSnapshotName"
        }
    }

    public struct ExportSnapshotResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct GetActiveNamesRequest: AWSEncodableShape {
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetActiveNames request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?

        @inlinable
        public init(pageToken: String? = nil) {
            self.pageToken = pageToken
        }

        private enum CodingKeys: String, CodingKey {
            case pageToken = "pageToken"
        }
    }

    public struct GetActiveNamesResult: AWSDecodableShape {
        /// The list of active names returned by the get active names request.
        public let activeNames: [String]?
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetActiveNames request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?

        @inlinable
        public init(activeNames: [String]? = nil, nextPageToken: String? = nil) {
            self.activeNames = activeNames
            self.nextPageToken = nextPageToken
        }

        private enum CodingKeys: String, CodingKey {
            case activeNames = "activeNames"
            case nextPageToken = "nextPageToken"
        }
    }

    public struct GetAlarmsRequest: AWSEncodableShape {
        /// The name of the alarm. Specify an alarm name to return information about a specific alarm.
        public let alarmName: String?
        /// The name of the Lightsail resource being monitored by the alarm. Specify a monitored resource name to return information about all alarms for a specific resource.
        public let monitoredResourceName: String?
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetAlarms request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?

        @inlinable
        public init(alarmName: String? = nil, monitoredResourceName: String? = nil, pageToken: String? = nil) {
            self.alarmName = alarmName
            self.monitoredResourceName = monitoredResourceName
            self.pageToken = pageToken
        }

        public func validate(name: String) throws {
            try self.validate(self.alarmName, name: "alarmName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.monitoredResourceName, name: "monitoredResourceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case alarmName = "alarmName"
            case monitoredResourceName = "monitoredResourceName"
            case pageToken = "pageToken"
        }
    }

    public struct GetAlarmsResult: AWSDecodableShape {
        /// An array of objects that describe the alarms.
        public let alarms: [Alarm]?
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetAlarms request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?

        @inlinable
        public init(alarms: [Alarm]? = nil, nextPageToken: String? = nil) {
            self.alarms = alarms
            self.nextPageToken = nextPageToken
        }

        private enum CodingKeys: String, CodingKey {
            case alarms = "alarms"
            case nextPageToken = "nextPageToken"
        }
    }

    public struct GetAutoSnapshotsRequest: AWSEncodableShape {
        /// The name of the source instance or disk from which to get automatic snapshot information.
        public let resourceName: String

        @inlinable
        public init(resourceName: String) {
            self.resourceName = resourceName
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceName, name: "resourceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case resourceName = "resourceName"
        }
    }

    public struct GetAutoSnapshotsResult: AWSDecodableShape {
        /// An array of objects that describe the automatic snapshots that are available for the specified source instance or disk.
        public let autoSnapshots: [AutoSnapshotDetails]?
        /// The name of the source instance or disk for the automatic snapshots.
        public let resourceName: String?
        /// The resource type of the automatic snapshot. The possible values are Instance, and Disk.
        public let resourceType: ResourceType?

        @inlinable
        public init(autoSnapshots: [AutoSnapshotDetails]? = nil, resourceName: String? = nil, resourceType: ResourceType? = nil) {
            self.autoSnapshots = autoSnapshots
            self.resourceName = resourceName
            self.resourceType = resourceType
        }

        private enum CodingKeys: String, CodingKey {
            case autoSnapshots = "autoSnapshots"
            case resourceName = "resourceName"
            case resourceType = "resourceType"
        }
    }

    public struct GetBlueprintsRequest: AWSEncodableShape {
        /// Returns a list of blueprints that are specific to Lightsail for Research.  You must use this parameter to view Lightsail for Research blueprints.
        public let appCategory: AppCategory?
        /// A Boolean value that indicates whether to include inactive (unavailable) blueprints in the response of your request.
        public let includeInactive: Bool?
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetBlueprints request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?

        @inlinable
        public init(appCategory: AppCategory? = nil, includeInactive: Bool? = nil, pageToken: String? = nil) {
            self.appCategory = appCategory
            self.includeInactive = includeInactive
            self.pageToken = pageToken
        }

        private enum CodingKeys: String, CodingKey {
            case appCategory = "appCategory"
            case includeInactive = "includeInactive"
            case pageToken = "pageToken"
        }
    }

    public struct GetBlueprintsResult: AWSDecodableShape {
        /// An array of key-value pairs that contains information about the available blueprints.
        public let blueprints: [Blueprint]?
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetBlueprints request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?

        @inlinable
        public init(blueprints: [Blueprint]? = nil, nextPageToken: String? = nil) {
            self.blueprints = blueprints
            self.nextPageToken = nextPageToken
        }

        private enum CodingKeys: String, CodingKey {
            case blueprints = "blueprints"
            case nextPageToken = "nextPageToken"
        }
    }

    public struct GetBucketAccessKeysRequest: AWSEncodableShape {
        /// The name of the bucket for which to return access keys.
        public let bucketName: String

        @inlinable
        public init(bucketName: String) {
            self.bucketName = bucketName
        }

        public func validate(name: String) throws {
            try self.validate(self.bucketName, name: "bucketName", parent: name, max: 54)
            try self.validate(self.bucketName, name: "bucketName", parent: name, min: 3)
            try self.validate(self.bucketName, name: "bucketName", parent: name, pattern: "^[a-z0-9][a-z0-9-]{1,52}[a-z0-9]$")
        }

        private enum CodingKeys: String, CodingKey {
            case bucketName = "bucketName"
        }
    }

    public struct GetBucketAccessKeysResult: AWSDecodableShape {
        /// An object that describes the access keys for the specified bucket.
        public let accessKeys: [AccessKey]?

        @inlinable
        public init(accessKeys: [AccessKey]? = nil) {
            self.accessKeys = accessKeys
        }

        private enum CodingKeys: String, CodingKey {
            case accessKeys = "accessKeys"
        }
    }

    public struct GetBucketBundlesRequest: AWSEncodableShape {
        /// A Boolean value that indicates whether to include inactive (unavailable) bundles in the response of your request.
        public let includeInactive: Bool?

        @inlinable
        public init(includeInactive: Bool? = nil) {
            self.includeInactive = includeInactive
        }

        private enum CodingKeys: String, CodingKey {
            case includeInactive = "includeInactive"
        }
    }

    public struct GetBucketBundlesResult: AWSDecodableShape {
        /// An object that describes bucket bundles.
        public let bundles: [BucketBundle]?

        @inlinable
        public init(bundles: [BucketBundle]? = nil) {
            self.bundles = bundles
        }

        private enum CodingKeys: String, CodingKey {
            case bundles = "bundles"
        }
    }

    public struct GetBucketMetricDataRequest: AWSEncodableShape {
        /// The name of the bucket for which to get metric data.
        public let bucketName: String
        /// The timestamp indicating the latest data to be returned.
        public let endTime: Date
        /// The metric for which you want to return information. Valid bucket metric names are listed below, along with the most useful statistics to include in your request, and the published unit value.  These bucket metrics are reported once per day.      BucketSizeBytes - The amount of data in bytes stored in a bucket. This value is calculated by summing the size of all objects in the bucket (including object versions), including the size of all parts for all incomplete multipart uploads to the bucket. Statistics: The most useful statistic is Maximum. Unit: The published unit is Bytes.     NumberOfObjects - The total number of objects stored in a bucket. This value is calculated by counting all objects in the bucket (including object versions) and the total number of parts for all incomplete multipart uploads to the bucket. Statistics: The most useful statistic is Average. Unit: The published unit is Count.
        public let metricName: BucketMetricName
        /// The granularity, in seconds, of the returned data points.  Bucket storage metrics are reported once per day. Therefore, you should specify a period of 86400 seconds, which is the number of seconds in a day.
        public let period: Int
        /// The timestamp indicating the earliest data to be returned.
        public let startTime: Date
        /// The statistic for the metric. The following statistics are available:    Minimum - The lowest value observed during the specified period. Use this value to determine low volumes of activity for your application.    Maximum - The highest value observed during the specified period. Use this value to determine high volumes of activity for your application.    Sum - The sum of all values submitted for the matching metric. You can use this statistic to determine the total volume of a metric.    Average - The value of Sum / SampleCount during the specified period. By comparing this statistic with the Minimum and Maximum values, you can determine the full scope of a metric and how close the average use is to the Minimum and Maximum values. This comparison helps you to know when to increase or decrease your resources.    SampleCount - The count, or number, of data points used for the statistical calculation.
        public let statistics: [MetricStatistic]
        /// The unit for the metric data request. Valid units depend on the metric data being requested. For the valid units with each available metric, see the metricName parameter.
        public let unit: MetricUnit

        @inlinable
        public init(bucketName: String, endTime: Date, metricName: BucketMetricName, period: Int, startTime: Date, statistics: [MetricStatistic], unit: MetricUnit) {
            self.bucketName = bucketName
            self.endTime = endTime
            self.metricName = metricName
            self.period = period
            self.startTime = startTime
            self.statistics = statistics
            self.unit = unit
        }

        public func validate(name: String) throws {
            try self.validate(self.bucketName, name: "bucketName", parent: name, max: 54)
            try self.validate(self.bucketName, name: "bucketName", parent: name, min: 3)
            try self.validate(self.bucketName, name: "bucketName", parent: name, pattern: "^[a-z0-9][a-z0-9-]{1,52}[a-z0-9]$")
            try self.validate(self.period, name: "period", parent: name, max: 86400)
            try self.validate(self.period, name: "period", parent: name, min: 60)
        }

        private enum CodingKeys: String, CodingKey {
            case bucketName = "bucketName"
            case endTime = "endTime"
            case metricName = "metricName"
            case period = "period"
            case startTime = "startTime"
            case statistics = "statistics"
            case unit = "unit"
        }
    }

    public struct GetBucketMetricDataResult: AWSDecodableShape {
        /// An array of objects that describe the metric data returned.
        public let metricData: [MetricDatapoint]?
        /// The name of the metric returned.
        public let metricName: BucketMetricName?

        @inlinable
        public init(metricData: [MetricDatapoint]? = nil, metricName: BucketMetricName? = nil) {
            self.metricData = metricData
            self.metricName = metricName
        }

        private enum CodingKeys: String, CodingKey {
            case metricData = "metricData"
            case metricName = "metricName"
        }
    }

    public struct GetBucketsRequest: AWSEncodableShape {
        /// The name of the bucket for which to return information. When omitted, the response includes all of your buckets in the Amazon Web Services Region where the request is made.
        public let bucketName: String?
        /// A Boolean value that indicates whether to include Lightsail instances that were given access to the bucket using the SetResourceAccessForBucket action.
        public let includeConnectedResources: Bool?
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetBuckets request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?

        @inlinable
        public init(bucketName: String? = nil, includeConnectedResources: Bool? = nil, pageToken: String? = nil) {
            self.bucketName = bucketName
            self.includeConnectedResources = includeConnectedResources
            self.pageToken = pageToken
        }

        public func validate(name: String) throws {
            try self.validate(self.bucketName, name: "bucketName", parent: name, max: 54)
            try self.validate(self.bucketName, name: "bucketName", parent: name, min: 3)
            try self.validate(self.bucketName, name: "bucketName", parent: name, pattern: "^[a-z0-9][a-z0-9-]{1,52}[a-z0-9]$")
        }

        private enum CodingKeys: String, CodingKey {
            case bucketName = "bucketName"
            case includeConnectedResources = "includeConnectedResources"
            case pageToken = "pageToken"
        }
    }

    public struct GetBucketsResult: AWSDecodableShape {
        /// An object that describes the synchronization status of the Amazon S3 account-level block public access feature for your Lightsail buckets. For more information about this feature and how it affects Lightsail buckets, see Block public access for buckets in Amazon Lightsail.
        public let accountLevelBpaSync: AccountLevelBpaSync?
        /// An array of objects that describe buckets.
        public let buckets: [Bucket]?
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetBuckets request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?

        @inlinable
        public init(accountLevelBpaSync: AccountLevelBpaSync? = nil, buckets: [Bucket]? = nil, nextPageToken: String? = nil) {
            self.accountLevelBpaSync = accountLevelBpaSync
            self.buckets = buckets
            self.nextPageToken = nextPageToken
        }

        private enum CodingKeys: String, CodingKey {
            case accountLevelBpaSync = "accountLevelBpaSync"
            case buckets = "buckets"
            case nextPageToken = "nextPageToken"
        }
    }

    public struct GetBundlesRequest: AWSEncodableShape {
        /// Returns a list of bundles that are specific to Lightsail for Research.  You must use this parameter to view Lightsail for Research bundles.
        public let appCategory: AppCategory?
        /// A Boolean value that indicates whether to include inactive (unavailable) bundles in the response of your request.
        public let includeInactive: Bool?
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetBundles request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?

        @inlinable
        public init(appCategory: AppCategory? = nil, includeInactive: Bool? = nil, pageToken: String? = nil) {
            self.appCategory = appCategory
            self.includeInactive = includeInactive
            self.pageToken = pageToken
        }

        private enum CodingKeys: String, CodingKey {
            case appCategory = "appCategory"
            case includeInactive = "includeInactive"
            case pageToken = "pageToken"
        }
    }

    public struct GetBundlesResult: AWSDecodableShape {
        /// An array of key-value pairs that contains information about the available bundles.
        public let bundles: [Bundle]?
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetBundles request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?

        @inlinable
        public init(bundles: [Bundle]? = nil, nextPageToken: String? = nil) {
            self.bundles = bundles
            self.nextPageToken = nextPageToken
        }

        private enum CodingKeys: String, CodingKey {
            case bundles = "bundles"
            case nextPageToken = "nextPageToken"
        }
    }

    public struct GetCertificatesRequest: AWSEncodableShape {
        /// The name for the certificate for which to return information. When omitted, the response includes all of your certificates in the Amazon Web Services Region where the request is made.
        public let certificateName: String?
        /// The status of the certificates for which to return information. For example, specify ISSUED to return only certificates with an ISSUED status. When omitted, the response includes all of your certificates in the Amazon Web Services Region where the request is made, regardless of their current status.
        public let certificateStatuses: [CertificateStatus]?
        /// Indicates whether to include detailed information about the certificates in the response. When omitted, the response includes only the certificate names, Amazon Resource Names (ARNs), domain names, and tags.
        public let includeCertificateDetails: Bool?
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetCertificates request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?

        @inlinable
        public init(certificateName: String? = nil, certificateStatuses: [CertificateStatus]? = nil, includeCertificateDetails: Bool? = nil, pageToken: String? = nil) {
            self.certificateName = certificateName
            self.certificateStatuses = certificateStatuses
            self.includeCertificateDetails = includeCertificateDetails
            self.pageToken = pageToken
        }

        private enum CodingKeys: String, CodingKey {
            case certificateName = "certificateName"
            case certificateStatuses = "certificateStatuses"
            case includeCertificateDetails = "includeCertificateDetails"
            case pageToken = "pageToken"
        }
    }

    public struct GetCertificatesResult: AWSDecodableShape {
        /// An object that describes certificates.
        public let certificates: [CertificateSummary]?
        /// If NextPageToken is returned there are more results available. The value of NextPageToken is a unique pagination token for each page. Make the call again using the returned token to retrieve the next page. Keep all other arguments unchanged.
        public let nextPageToken: String?

        @inlinable
        public init(certificates: [CertificateSummary]? = nil, nextPageToken: String? = nil) {
            self.certificates = certificates
            self.nextPageToken = nextPageToken
        }

        private enum CodingKeys: String, CodingKey {
            case certificates = "certificates"
            case nextPageToken = "nextPageToken"
        }
    }

    public struct GetCloudFormationStackRecordsRequest: AWSEncodableShape {
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetClouFormationStackRecords request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?

        @inlinable
        public init(pageToken: String? = nil) {
            self.pageToken = pageToken
        }

        private enum CodingKeys: String, CodingKey {
            case pageToken = "pageToken"
        }
    }

    public struct GetCloudFormationStackRecordsResult: AWSDecodableShape {
        /// A list of objects describing the CloudFormation stack records.
        public let cloudFormationStackRecords: [CloudFormationStackRecord]?
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetCloudFormationStackRecords request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?

        @inlinable
        public init(cloudFormationStackRecords: [CloudFormationStackRecord]? = nil, nextPageToken: String? = nil) {
            self.cloudFormationStackRecords = cloudFormationStackRecords
            self.nextPageToken = nextPageToken
        }

        private enum CodingKeys: String, CodingKey {
            case cloudFormationStackRecords = "cloudFormationStackRecords"
            case nextPageToken = "nextPageToken"
        }
    }

    public struct GetContactMethodsRequest: AWSEncodableShape {
        /// The protocols used to send notifications, such as Email, or SMS (text messaging). Specify a protocol in your request to return information about a specific contact method protocol.
        public let protocols: [ContactProtocol]?

        @inlinable
        public init(protocols: [ContactProtocol]? = nil) {
            self.protocols = protocols
        }

        private enum CodingKeys: String, CodingKey {
            case protocols = "protocols"
        }
    }

    public struct GetContactMethodsResult: AWSDecodableShape {
        /// An array of objects that describe the contact methods.
        public let contactMethods: [ContactMethod]?

        @inlinable
        public init(contactMethods: [ContactMethod]? = nil) {
            self.contactMethods = contactMethods
        }

        private enum CodingKeys: String, CodingKey {
            case contactMethods = "contactMethods"
        }
    }

    public struct GetContainerAPIMetadataRequest: AWSEncodableShape {
        public init() {}
    }

    public struct GetContainerAPIMetadataResult: AWSDecodableShape {
        /// Metadata about Lightsail containers, such as the current version of the Lightsail Control (lightsailctl) plugin.
        public let metadata: [[String: String]]?

        @inlinable
        public init(metadata: [[String: String]]? = nil) {
            self.metadata = metadata
        }

        private enum CodingKeys: String, CodingKey {
            case metadata = "metadata"
        }
    }

    public struct GetContainerImagesRequest: AWSEncodableShape {
        /// The name of the container service for which to return registered container images.
        public let serviceName: String

        @inlinable
        public init(serviceName: String) {
            self.serviceName = serviceName
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            _ = encoder.container(keyedBy: CodingKeys.self)
            request.encodePath(self.serviceName, key: "serviceName")
        }

        public func validate(name: String) throws {
            try self.validate(self.serviceName, name: "serviceName", parent: name, max: 63)
            try self.validate(self.serviceName, name: "serviceName", parent: name, min: 1)
            try self.validate(self.serviceName, name: "serviceName", parent: name, pattern: "^[a-z0-9]{1,2}|[a-z0-9][a-z0-9-]+[a-z0-9]$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct GetContainerImagesResult: AWSDecodableShape {
        /// An array of objects that describe container images that are registered to the container service.
        public let containerImages: [ContainerImage]?

        @inlinable
        public init(containerImages: [ContainerImage]? = nil) {
            self.containerImages = containerImages
        }

        private enum CodingKeys: String, CodingKey {
            case containerImages = "containerImages"
        }
    }

    public struct GetContainerLogRequest: AWSEncodableShape {
        /// The name of the container that is either running or previously ran on the container service for which to return a log.
        public let containerName: String
        /// The end of the time interval for which to get log data. Constraints:   Specified in Coordinated Universal Time (UTC).   Specified in the Unix time format. For example, if you wish to use an end time of October 1, 2018, at 9 PM UTC, specify 1538427600 as the end time.   You can convert a human-friendly time to Unix time format using a converter like Epoch converter.
        public let endTime: Date?
        /// The pattern to use to filter the returned log events to a specific term. The following are a few examples of filter patterns that you can specify:   To return all log events, specify a filter pattern of "".   To exclude log events that contain the ERROR term, and return all other log events, specify a filter pattern of "-ERROR".   To return log events that contain the ERROR term, specify a filter pattern of "ERROR".   To return log events that contain both the ERROR and Exception terms, specify a filter pattern of "ERROR Exception".   To return log events that contain the ERROR or the Exception term, specify a filter pattern of "?ERROR ?Exception".
        public let filterPattern: String?
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetContainerLog request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?
        /// The name of the container service for which to get a container log.
        public let serviceName: String
        /// The start of the time interval for which to get log data. Constraints:   Specified in Coordinated Universal Time (UTC).   Specified in the Unix time format. For example, if you wish to use a start time of October 1, 2018, at 8 PM UTC, specify 1538424000 as the start time.   You can convert a human-friendly time to Unix time format using a converter like Epoch converter.
        public let startTime: Date?

        @inlinable
        public init(containerName: String, endTime: Date? = nil, filterPattern: String? = nil, pageToken: String? = nil, serviceName: String, startTime: Date? = nil) {
            self.containerName = containerName
            self.endTime = endTime
            self.filterPattern = filterPattern
            self.pageToken = pageToken
            self.serviceName = serviceName
            self.startTime = startTime
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            _ = encoder.container(keyedBy: CodingKeys.self)
            request.encodePath(self.containerName, key: "containerName")
            request.encodeQuery(self.endTime, key: "endTime")
            request.encodeQuery(self.filterPattern, key: "filterPattern")
            request.encodeQuery(self.pageToken, key: "pageToken")
            request.encodePath(self.serviceName, key: "serviceName")
            request.encodeQuery(self.startTime, key: "startTime")
        }

        public func validate(name: String) throws {
            try self.validate(self.serviceName, name: "serviceName", parent: name, max: 63)
            try self.validate(self.serviceName, name: "serviceName", parent: name, min: 1)
            try self.validate(self.serviceName, name: "serviceName", parent: name, pattern: "^[a-z0-9]{1,2}|[a-z0-9][a-z0-9-]+[a-z0-9]$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct GetContainerLogResult: AWSDecodableShape {
        /// An array of objects that describe the log events of a container.
        public let logEvents: [ContainerServiceLogEvent]?
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetContainerLog request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?

        @inlinable
        public init(logEvents: [ContainerServiceLogEvent]? = nil, nextPageToken: String? = nil) {
            self.logEvents = logEvents
            self.nextPageToken = nextPageToken
        }

        private enum CodingKeys: String, CodingKey {
            case logEvents = "logEvents"
            case nextPageToken = "nextPageToken"
        }
    }

    public struct GetContainerServiceDeploymentsRequest: AWSEncodableShape {
        /// The name of the container service for which to return deployments.
        public let serviceName: String

        @inlinable
        public init(serviceName: String) {
            self.serviceName = serviceName
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            _ = encoder.container(keyedBy: CodingKeys.self)
            request.encodePath(self.serviceName, key: "serviceName")
        }

        public func validate(name: String) throws {
            try self.validate(self.serviceName, name: "serviceName", parent: name, max: 63)
            try self.validate(self.serviceName, name: "serviceName", parent: name, min: 1)
            try self.validate(self.serviceName, name: "serviceName", parent: name, pattern: "^[a-z0-9]{1,2}|[a-z0-9][a-z0-9-]+[a-z0-9]$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct GetContainerServiceDeploymentsResult: AWSDecodableShape {
        /// An array of objects that describe deployments for a container service.
        public let deployments: [ContainerServiceDeployment]?

        @inlinable
        public init(deployments: [ContainerServiceDeployment]? = nil) {
            self.deployments = deployments
        }

        private enum CodingKeys: String, CodingKey {
            case deployments = "deployments"
        }
    }

    public struct GetContainerServiceMetricDataRequest: AWSEncodableShape {
        /// The end time of the time period.
        public let endTime: Date
        /// The metric for which you want to return information. Valid container service metric names are listed below, along with the most useful statistics to include in your request, and the published unit value.    CPUUtilization - The average percentage of compute units that are currently in use across all nodes of the container service. This metric identifies the processing power required to run containers on each node of the container service. Statistics: The most useful statistics are Maximum and Average. Unit: The published unit is Percent.    MemoryUtilization - The average percentage of available memory that is currently in use across all nodes of the container service. This metric identifies the memory required to run containers on each node of the container service. Statistics: The most useful statistics are Maximum and Average. Unit: The published unit is Percent.
        public let metricName: ContainerServiceMetricName
        /// The granularity, in seconds, of the returned data points. All container service metric data is available in 5-minute (300 seconds) granularity.
        public let period: Int
        /// The name of the container service for which to get metric data.
        public let serviceName: String
        /// The start time of the time period.
        public let startTime: Date
        /// The statistic for the metric. The following statistics are available:    Minimum - The lowest value observed during the specified period. Use this value to determine low volumes of activity for your application.    Maximum - The highest value observed during the specified period. Use this value to determine high volumes of activity for your application.    Sum - All values submitted for the matching metric added together. You can use this statistic to determine the total volume of a metric.    Average - The value of Sum / SampleCount during the specified period. By comparing this statistic with the Minimum and Maximum values, you can determine the full scope of a metric and how close the average use is to the Minimum and Maximum values. This comparison helps you to know when to increase or decrease your resources.    SampleCount - The count, or number, of data points used for the statistical calculation.
        public let statistics: [MetricStatistic]

        @inlinable
        public init(endTime: Date, metricName: ContainerServiceMetricName, period: Int, serviceName: String, startTime: Date, statistics: [MetricStatistic]) {
            self.endTime = endTime
            self.metricName = metricName
            self.period = period
            self.serviceName = serviceName
            self.startTime = startTime
            self.statistics = statistics
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            _ = encoder.container(keyedBy: CodingKeys.self)
            request.encodeQuery(self.endTime, key: "endTime")
            request.encodeQuery(self.metricName, key: "metricName")
            request.encodeQuery(self.period, key: "period")
            request.encodePath(self.serviceName, key: "serviceName")
            request.encodeQuery(self.startTime, key: "startTime")
            request.encodeQuery(self.statistics, key: "statistics")
        }

        public func validate(name: String) throws {
            try self.validate(self.period, name: "period", parent: name, max: 86400)
            try self.validate(self.period, name: "period", parent: name, min: 60)
            try self.validate(self.serviceName, name: "serviceName", parent: name, max: 63)
            try self.validate(self.serviceName, name: "serviceName", parent: name, min: 1)
            try self.validate(self.serviceName, name: "serviceName", parent: name, pattern: "^[a-z0-9]{1,2}|[a-z0-9][a-z0-9-]+[a-z0-9]$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct GetContainerServiceMetricDataResult: AWSDecodableShape {
        /// An array of objects that describe the metric data returned.
        public let metricData: [MetricDatapoint]?
        /// The name of the metric returned.
        public let metricName: ContainerServiceMetricName?

        @inlinable
        public init(metricData: [MetricDatapoint]? = nil, metricName: ContainerServiceMetricName? = nil) {
            self.metricData = metricData
            self.metricName = metricName
        }

        private enum CodingKeys: String, CodingKey {
            case metricData = "metricData"
            case metricName = "metricName"
        }
    }

    public struct GetContainerServicePowersRequest: AWSEncodableShape {
        public init() {}
    }

    public struct GetContainerServicePowersResult: AWSDecodableShape {
        /// An array of objects that describe the powers that can be specified for a container service.
        public let powers: [ContainerServicePower]?

        @inlinable
        public init(powers: [ContainerServicePower]? = nil) {
            self.powers = powers
        }

        private enum CodingKeys: String, CodingKey {
            case powers = "powers"
        }
    }

    public struct GetContainerServicesRequest: AWSEncodableShape {
        /// The name of the container service for which to return information. When omitted, the response includes all of your container services in the Amazon Web Services Region where the request is made.
        public let serviceName: String?

        @inlinable
        public init(serviceName: String? = nil) {
            self.serviceName = serviceName
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            _ = encoder.container(keyedBy: CodingKeys.self)
            request.encodeQuery(self.serviceName, key: "serviceName")
        }

        public func validate(name: String) throws {
            try self.validate(self.serviceName, name: "serviceName", parent: name, max: 63)
            try self.validate(self.serviceName, name: "serviceName", parent: name, min: 1)
            try self.validate(self.serviceName, name: "serviceName", parent: name, pattern: "^[a-z0-9]{1,2}|[a-z0-9][a-z0-9-]+[a-z0-9]$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct GetCostEstimateRequest: AWSEncodableShape {
        /// The cost estimate end time. Constraints:   Specified in Coordinated Universal Time (UTC).   Specified in the Unix time format. For example, if you want to use an end time of October 1, 2018, at 9 PM UTC, specify 1538427600 as the end time.   You can convert a human-friendly time to Unix time format using a converter like Epoch converter.
        public let endTime: Date
        /// The resource name.
        public let resourceName: String
        /// The cost estimate start time. Constraints:   Specified in Coordinated Universal Time (UTC).   Specified in the Unix time format. For example, if you want to use a start time of October 1, 2018, at 8 PM UTC, specify 1538424000 as the start time.   You can convert a human-friendly time to Unix time format using a converter like Epoch converter.
        public let startTime: Date

        @inlinable
        public init(endTime: Date, resourceName: String, startTime: Date) {
            self.endTime = endTime
            self.resourceName = resourceName
            self.startTime = startTime
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceName, name: "resourceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case endTime = "endTime"
            case resourceName = "resourceName"
            case startTime = "startTime"
        }
    }

    public struct GetCostEstimateResult: AWSDecodableShape {
        /// Returns the estimate's forecasted cost or usage.
        public let resourcesBudgetEstimate: [ResourceBudgetEstimate]?

        @inlinable
        public init(resourcesBudgetEstimate: [ResourceBudgetEstimate]? = nil) {
            self.resourcesBudgetEstimate = resourcesBudgetEstimate
        }

        private enum CodingKeys: String, CodingKey {
            case resourcesBudgetEstimate = "resourcesBudgetEstimate"
        }
    }

    public struct GetDiskRequest: AWSEncodableShape {
        /// The name of the disk (my-disk).
        public let diskName: String

        @inlinable
        public init(diskName: String) {
            self.diskName = diskName
        }

        public func validate(name: String) throws {
            try self.validate(self.diskName, name: "diskName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case diskName = "diskName"
        }
    }

    public struct GetDiskResult: AWSDecodableShape {
        /// An object containing information about the disk.
        public let disk: Disk?

        @inlinable
        public init(disk: Disk? = nil) {
            self.disk = disk
        }

        private enum CodingKeys: String, CodingKey {
            case disk = "disk"
        }
    }

    public struct GetDiskSnapshotRequest: AWSEncodableShape {
        /// The name of the disk snapshot (my-disk-snapshot).
        public let diskSnapshotName: String

        @inlinable
        public init(diskSnapshotName: String) {
            self.diskSnapshotName = diskSnapshotName
        }

        public func validate(name: String) throws {
            try self.validate(self.diskSnapshotName, name: "diskSnapshotName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case diskSnapshotName = "diskSnapshotName"
        }
    }

    public struct GetDiskSnapshotResult: AWSDecodableShape {
        /// An object containing information about the disk snapshot.
        public let diskSnapshot: DiskSnapshot?

        @inlinable
        public init(diskSnapshot: DiskSnapshot? = nil) {
            self.diskSnapshot = diskSnapshot
        }

        private enum CodingKeys: String, CodingKey {
            case diskSnapshot = "diskSnapshot"
        }
    }

    public struct GetDiskSnapshotsRequest: AWSEncodableShape {
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetDiskSnapshots request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?

        @inlinable
        public init(pageToken: String? = nil) {
            self.pageToken = pageToken
        }

        private enum CodingKeys: String, CodingKey {
            case pageToken = "pageToken"
        }
    }

    public struct GetDiskSnapshotsResult: AWSDecodableShape {
        /// An array of objects containing information about all block storage disk snapshots.
        public let diskSnapshots: [DiskSnapshot]?
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetDiskSnapshots request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?

        @inlinable
        public init(diskSnapshots: [DiskSnapshot]? = nil, nextPageToken: String? = nil) {
            self.diskSnapshots = diskSnapshots
            self.nextPageToken = nextPageToken
        }

        private enum CodingKeys: String, CodingKey {
            case diskSnapshots = "diskSnapshots"
            case nextPageToken = "nextPageToken"
        }
    }

    public struct GetDisksRequest: AWSEncodableShape {
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetDisks request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?

        @inlinable
        public init(pageToken: String? = nil) {
            self.pageToken = pageToken
        }

        private enum CodingKeys: String, CodingKey {
            case pageToken = "pageToken"
        }
    }

    public struct GetDisksResult: AWSDecodableShape {
        /// An array of objects containing information about all block storage disks.
        public let disks: [Disk]?
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetDisks request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?

        @inlinable
        public init(disks: [Disk]? = nil, nextPageToken: String? = nil) {
            self.disks = disks
            self.nextPageToken = nextPageToken
        }

        private enum CodingKeys: String, CodingKey {
            case disks = "disks"
            case nextPageToken = "nextPageToken"
        }
    }

    public struct GetDistributionBundlesRequest: AWSEncodableShape {
        public init() {}
    }

    public struct GetDistributionBundlesResult: AWSDecodableShape {
        /// An object that describes a distribution bundle.
        public let bundles: [DistributionBundle]?

        @inlinable
        public init(bundles: [DistributionBundle]? = nil) {
            self.bundles = bundles
        }

        private enum CodingKeys: String, CodingKey {
            case bundles = "bundles"
        }
    }

    public struct GetDistributionLatestCacheResetRequest: AWSEncodableShape {
        /// The name of the distribution for which to return the timestamp of the last cache reset. Use the GetDistributions action to get a list of distribution names that you can specify. When omitted, the response includes the latest cache reset timestamp of all your distributions.
        public let distributionName: String?

        @inlinable
        public init(distributionName: String? = nil) {
            self.distributionName = distributionName
        }

        public func validate(name: String) throws {
            try self.validate(self.distributionName, name: "distributionName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case distributionName = "distributionName"
        }
    }

    public struct GetDistributionLatestCacheResetResult: AWSDecodableShape {
        /// The timestamp of the last cache reset (1479734909.17) in Unix time format.
        public let createTime: Date?
        /// The status of the last cache reset.
        public let status: String?

        @inlinable
        public init(createTime: Date? = nil, status: String? = nil) {
            self.createTime = createTime
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case createTime = "createTime"
            case status = "status"
        }
    }

    public struct GetDistributionMetricDataRequest: AWSEncodableShape {
        /// The name of the distribution for which to get metric data. Use the GetDistributions action to get a list of distribution names that you can specify.
        public let distributionName: String
        /// The end of the time interval for which to get metric data. Constraints:   Specified in Coordinated Universal Time (UTC).   Specified in the Unix time format. For example, if you wish to use an end time of October 1, 2018, at 9 PM UTC, specify 1538427600 as the end time.   You can convert a human-friendly time to Unix time format using a converter like Epoch converter.
        public let endTime: Date
        /// The metric for which you want to return information. Valid distribution metric names are listed below, along with the most useful statistics to include in your request, and the published unit value.     Requests - The total number of viewer requests received by your Lightsail distribution, for all HTTP methods, and for both HTTP and HTTPS requests.  Statistics: The most useful statistic is Sum.  Unit: The published unit is None.     BytesDownloaded - The number of bytes downloaded by viewers for GET, HEAD, and OPTIONS requests.  Statistics: The most useful statistic is Sum.  Unit: The published unit is None.     BytesUploaded  - The number of bytes uploaded to your origin by your Lightsail distribution, using POST and PUT requests.  Statistics: The most useful statistic is Sum.  Unit: The published unit is None.     TotalErrorRate - The percentage of all viewer requests for which the response's HTTP status code was 4xx or 5xx.  Statistics: The most useful statistic is Average.  Unit: The published unit is Percent.     4xxErrorRate - The percentage of all viewer requests for which the response's HTTP status cod was 4xx. In these cases, the client or client viewer may have made an error. For example, a status code of 404 (Not Found) means that the client requested an object that could not be found.  Statistics: The most useful statistic is Average.  Unit: The published unit is Percent.     5xxErrorRate - The percentage of all viewer requests for which the response's HTTP status code was 5xx. In these cases, the origin server did not satisfy the requests. For example, a status code of 503 (Service Unavailable) means that the origin server is currently unavailable.  Statistics: The most useful statistic is Average.  Unit: The published unit is Percent.
        public let metricName: DistributionMetricName
        /// The granularity, in seconds, for the metric data points that will be returned.
        public let period: Int
        /// The start of the time interval for which to get metric data. Constraints:   Specified in Coordinated Universal Time (UTC).   Specified in the Unix time format. For example, if you wish to use a start time of October 1, 2018, at 8 PM UTC, specify 1538424000 as the start time.   You can convert a human-friendly time to Unix time format using a converter like Epoch converter.
        public let startTime: Date
        /// The statistic for the metric. The following statistics are available:    Minimum - The lowest value observed during the specified period. Use this value to determine low volumes of activity for your application.    Maximum - The highest value observed during the specified period. Use this value to determine high volumes of activity for your application.    Sum - All values submitted for the matching metric added together. You can use this statistic to determine the total volume of a metric.    Average - The value of Sum / SampleCount during the specified period. By comparing this statistic with the Minimum and Maximum values, you can determine the full scope of a metric and how close the average use is to the Minimum and Maximum values. This comparison helps you to know when to increase or decrease your resources.    SampleCount - The count, or number, of data points used for the statistical calculation.
        public let statistics: [MetricStatistic]
        /// The unit for the metric data request. Valid units depend on the metric data being requested. For the valid units with each available metric, see the metricName parameter.
        public let unit: MetricUnit

        @inlinable
        public init(distributionName: String, endTime: Date, metricName: DistributionMetricName, period: Int, startTime: Date, statistics: [MetricStatistic], unit: MetricUnit) {
            self.distributionName = distributionName
            self.endTime = endTime
            self.metricName = metricName
            self.period = period
            self.startTime = startTime
            self.statistics = statistics
            self.unit = unit
        }

        public func validate(name: String) throws {
            try self.validate(self.distributionName, name: "distributionName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.period, name: "period", parent: name, max: 86400)
            try self.validate(self.period, name: "period", parent: name, min: 60)
        }

        private enum CodingKeys: String, CodingKey {
            case distributionName = "distributionName"
            case endTime = "endTime"
            case metricName = "metricName"
            case period = "period"
            case startTime = "startTime"
            case statistics = "statistics"
            case unit = "unit"
        }
    }

    public struct GetDistributionMetricDataResult: AWSDecodableShape {
        /// An array of objects that describe the metric data returned.
        public let metricData: [MetricDatapoint]?
        /// The name of the metric returned.
        public let metricName: DistributionMetricName?

        @inlinable
        public init(metricData: [MetricDatapoint]? = nil, metricName: DistributionMetricName? = nil) {
            self.metricData = metricData
            self.metricName = metricName
        }

        private enum CodingKeys: String, CodingKey {
            case metricData = "metricData"
            case metricName = "metricName"
        }
    }

    public struct GetDistributionsRequest: AWSEncodableShape {
        /// The name of the distribution for which to return information. When omitted, the response includes all of your distributions in the Amazon Web Services Region where the request is made.
        public let distributionName: String?
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetDistributions request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?

        @inlinable
        public init(distributionName: String? = nil, pageToken: String? = nil) {
            self.distributionName = distributionName
            self.pageToken = pageToken
        }

        public func validate(name: String) throws {
            try self.validate(self.distributionName, name: "distributionName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case distributionName = "distributionName"
            case pageToken = "pageToken"
        }
    }

    public struct GetDistributionsResult: AWSDecodableShape {
        /// An array of objects that describe your distributions.
        public let distributions: [LightsailDistribution]?
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetDistributions request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?

        @inlinable
        public init(distributions: [LightsailDistribution]? = nil, nextPageToken: String? = nil) {
            self.distributions = distributions
            self.nextPageToken = nextPageToken
        }

        private enum CodingKeys: String, CodingKey {
            case distributions = "distributions"
            case nextPageToken = "nextPageToken"
        }
    }

    public struct GetDomainRequest: AWSEncodableShape {
        /// The domain name for which your want to return information about.
        public let domainName: String

        @inlinable
        public init(domainName: String) {
            self.domainName = domainName
        }

        private enum CodingKeys: String, CodingKey {
            case domainName = "domainName"
        }
    }

    public struct GetDomainResult: AWSDecodableShape {
        /// An array of key-value pairs containing information about your get domain request.
        public let domain: Domain?

        @inlinable
        public init(domain: Domain? = nil) {
            self.domain = domain
        }

        private enum CodingKeys: String, CodingKey {
            case domain = "domain"
        }
    }

    public struct GetDomainsRequest: AWSEncodableShape {
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetDomains request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?

        @inlinable
        public init(pageToken: String? = nil) {
            self.pageToken = pageToken
        }

        private enum CodingKeys: String, CodingKey {
            case pageToken = "pageToken"
        }
    }

    public struct GetDomainsResult: AWSDecodableShape {
        /// An array of key-value pairs containing information about each of the domain entries in the user's account.
        public let domains: [Domain]?
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetDomains request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?

        @inlinable
        public init(domains: [Domain]? = nil, nextPageToken: String? = nil) {
            self.domains = domains
            self.nextPageToken = nextPageToken
        }

        private enum CodingKeys: String, CodingKey {
            case domains = "domains"
            case nextPageToken = "nextPageToken"
        }
    }

    public struct GetExportSnapshotRecordsRequest: AWSEncodableShape {
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetExportSnapshotRecords request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?

        @inlinable
        public init(pageToken: String? = nil) {
            self.pageToken = pageToken
        }

        private enum CodingKeys: String, CodingKey {
            case pageToken = "pageToken"
        }
    }

    public struct GetExportSnapshotRecordsResult: AWSDecodableShape {
        /// A list of objects describing the export snapshot records.
        public let exportSnapshotRecords: [ExportSnapshotRecord]?
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetExportSnapshotRecords request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?

        @inlinable
        public init(exportSnapshotRecords: [ExportSnapshotRecord]? = nil, nextPageToken: String? = nil) {
            self.exportSnapshotRecords = exportSnapshotRecords
            self.nextPageToken = nextPageToken
        }

        private enum CodingKeys: String, CodingKey {
            case exportSnapshotRecords = "exportSnapshotRecords"
            case nextPageToken = "nextPageToken"
        }
    }

    public struct GetInstanceAccessDetailsRequest: AWSEncodableShape {
        /// The name of the instance to access.
        public let instanceName: String
        /// The protocol to use to connect to your instance. Defaults to ssh.
        public let `protocol`: InstanceAccessProtocol?

        @inlinable
        public init(instanceName: String, protocol: InstanceAccessProtocol? = nil) {
            self.instanceName = instanceName
            self.`protocol` = `protocol`
        }

        public func validate(name: String) throws {
            try self.validate(self.instanceName, name: "instanceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case instanceName = "instanceName"
            case `protocol` = "protocol"
        }
    }

    public struct GetInstanceAccessDetailsResult: AWSDecodableShape {
        /// An array of key-value pairs containing information about a get instance access request.
        public let accessDetails: InstanceAccessDetails?

        @inlinable
        public init(accessDetails: InstanceAccessDetails? = nil) {
            self.accessDetails = accessDetails
        }

        private enum CodingKeys: String, CodingKey {
            case accessDetails = "accessDetails"
        }
    }

    public struct GetInstanceMetricDataRequest: AWSEncodableShape {
        /// The end time of the time period.
        public let endTime: Date
        /// The name of the instance for which you want to get metrics data.
        public let instanceName: String
        /// The metric for which you want to return information. Valid instance metric names are listed below, along with the most useful statistics to include in your request, and the published unit value.     BurstCapacityPercentage - The percentage of CPU performance available for your instance to burst above its baseline. Your instance continuously accrues and consumes burst capacity. Burst capacity stops accruing when your instance's BurstCapacityPercentage reaches 100%. For more information, see Viewing instance burst capacity in Amazon Lightsail.  Statistics: The most useful statistics are Maximum and Average.  Unit: The published unit is Percent.     BurstCapacityTime - The available amount of time for your instance to burst at 100% CPU utilization. Your instance continuously accrues and consumes burst capacity. Burst capacity time stops accruing when your instance's BurstCapacityPercentage metric reaches 100%. Burst capacity time is consumed at the full rate only when your instance operates at 100% CPU utilization. For example, if your instance operates at 50% CPU utilization in the burstable zone for a 5-minute period, then it consumes CPU burst capacity minutes at a 50% rate in that period. Your instance consumed 2 minutes and 30 seconds of CPU burst capacity minutes in the 5-minute period. For more information, see Viewing instance burst capacity in Amazon Lightsail.  Statistics: The most useful statistics are Maximum and Average.  Unit: The published unit is Seconds.     CPUUtilization - The percentage of allocated compute units that are currently in use on the instance. This metric identifies the processing power to run the applications on the instance. Tools in your operating system can show a lower percentage than Lightsail when the instance is not allocated a full processor core.  Statistics: The most useful statistics are Maximum and Average.  Unit: The published unit is Percent.     NetworkIn - The number of bytes received on all network interfaces by the instance. This metric identifies the volume of incoming network traffic to the instance. The number reported is the number of bytes received during the period. Because this metric is reported in 5-minute intervals, divide the reported number by 300 to find Bytes/second.  Statistics: The most useful statistic is Sum.  Unit: The published unit is Bytes.     NetworkOut - The number of bytes sent out on all network interfaces by the instance. This metric identifies the volume of outgoing network traffic from the instance. The number reported is the number of bytes sent during the period. Because this metric is reported in 5-minute intervals, divide the reported number by 300 to find Bytes/second.  Statistics: The most useful statistic is Sum.  Unit: The published unit is Bytes.     StatusCheckFailed - Reports whether the instance passed or failed both the instance status check and the system status check. This metric can be either 0 (passed) or 1 (failed). This metric data is available in 1-minute (60 seconds) granularity.  Statistics: The most useful statistic is Sum.  Unit: The published unit is Count.     StatusCheckFailed_Instance - Reports whether the instance passed or failed the instance status check. This metric can be either 0 (passed) or 1 (failed). This metric data is available in 1-minute (60 seconds) granularity.  Statistics: The most useful statistic is Sum.  Unit: The published unit is Count.     StatusCheckFailed_System - Reports whether the instance passed or failed the system status check. This metric can be either 0 (passed) or 1 (failed). This metric data is available in 1-minute (60 seconds) granularity.  Statistics: The most useful statistic is Sum.  Unit: The published unit is Count.     MetadataNoToken - Reports the number of times that the instance metadata service was successfully accessed without a token. This metric determines if there are any processes accessing instance metadata by using Instance Metadata Service Version 1, which doesn't use a token. If all requests use token-backed sessions, such as Instance Metadata Service Version 2, then the value is 0.  Statistics: The most useful statistic is Sum.  Unit: The published unit is Count.
        public let metricName: InstanceMetricName
        /// The granularity, in seconds, of the returned data points. The StatusCheckFailed, StatusCheckFailed_Instance, and StatusCheckFailed_System instance metric data is available in 1-minute (60 seconds) granularity. All other instance metric data is available in 5-minute (300 seconds) granularity.
        public let period: Int
        /// The start time of the time period.
        public let startTime: Date
        /// The statistic for the metric. The following statistics are available:    Minimum - The lowest value observed during the specified period. Use this value to determine low volumes of activity for your application.    Maximum - The highest value observed during the specified period. Use this value to determine high volumes of activity for your application.    Sum - All values submitted for the matching metric added together. You can use this statistic to determine the total volume of a metric.    Average - The value of Sum / SampleCount during the specified period. By comparing this statistic with the Minimum and Maximum values, you can determine the full scope of a metric and how close the average use is to the Minimum and Maximum values. This comparison helps you to know when to increase or decrease your resources.    SampleCount - The count, or number, of data points used for the statistical calculation.
        public let statistics: [MetricStatistic]
        /// The unit for the metric data request. Valid units depend on the metric data being requested. For the valid units to specify with each available metric, see the metricName parameter.
        public let unit: MetricUnit

        @inlinable
        public init(endTime: Date, instanceName: String, metricName: InstanceMetricName, period: Int, startTime: Date, statistics: [MetricStatistic], unit: MetricUnit) {
            self.endTime = endTime
            self.instanceName = instanceName
            self.metricName = metricName
            self.period = period
            self.startTime = startTime
            self.statistics = statistics
            self.unit = unit
        }

        public func validate(name: String) throws {
            try self.validate(self.instanceName, name: "instanceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.period, name: "period", parent: name, max: 86400)
            try self.validate(self.period, name: "period", parent: name, min: 60)
        }

        private enum CodingKeys: String, CodingKey {
            case endTime = "endTime"
            case instanceName = "instanceName"
            case metricName = "metricName"
            case period = "period"
            case startTime = "startTime"
            case statistics = "statistics"
            case unit = "unit"
        }
    }

    public struct GetInstanceMetricDataResult: AWSDecodableShape {
        /// An array of objects that describe the metric data returned.
        public let metricData: [MetricDatapoint]?
        /// The name of the metric returned.
        public let metricName: InstanceMetricName?

        @inlinable
        public init(metricData: [MetricDatapoint]? = nil, metricName: InstanceMetricName? = nil) {
            self.metricData = metricData
            self.metricName = metricName
        }

        private enum CodingKeys: String, CodingKey {
            case metricData = "metricData"
            case metricName = "metricName"
        }
    }

    public struct GetInstancePortStatesRequest: AWSEncodableShape {
        /// The name of the instance for which to return firewall port states.
        public let instanceName: String

        @inlinable
        public init(instanceName: String) {
            self.instanceName = instanceName
        }

        public func validate(name: String) throws {
            try self.validate(self.instanceName, name: "instanceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case instanceName = "instanceName"
        }
    }

    public struct GetInstancePortStatesResult: AWSDecodableShape {
        /// An array of objects that describe the firewall port states for the specified instance.
        public let portStates: [InstancePortState]?

        @inlinable
        public init(portStates: [InstancePortState]? = nil) {
            self.portStates = portStates
        }

        private enum CodingKeys: String, CodingKey {
            case portStates = "portStates"
        }
    }

    public struct GetInstanceRequest: AWSEncodableShape {
        /// The name of the instance.
        public let instanceName: String

        @inlinable
        public init(instanceName: String) {
            self.instanceName = instanceName
        }

        public func validate(name: String) throws {
            try self.validate(self.instanceName, name: "instanceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case instanceName = "instanceName"
        }
    }

    public struct GetInstanceResult: AWSDecodableShape {
        /// An array of key-value pairs containing information about the specified instance.
        public let instance: Instance?

        @inlinable
        public init(instance: Instance? = nil) {
            self.instance = instance
        }

        private enum CodingKeys: String, CodingKey {
            case instance = "instance"
        }
    }

    public struct GetInstanceSnapshotRequest: AWSEncodableShape {
        /// The name of the snapshot for which you are requesting information.
        public let instanceSnapshotName: String

        @inlinable
        public init(instanceSnapshotName: String) {
            self.instanceSnapshotName = instanceSnapshotName
        }

        public func validate(name: String) throws {
            try self.validate(self.instanceSnapshotName, name: "instanceSnapshotName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case instanceSnapshotName = "instanceSnapshotName"
        }
    }

    public struct GetInstanceSnapshotResult: AWSDecodableShape {
        /// An array of key-value pairs containing information about the results of your get instance snapshot request.
        public let instanceSnapshot: InstanceSnapshot?

        @inlinable
        public init(instanceSnapshot: InstanceSnapshot? = nil) {
            self.instanceSnapshot = instanceSnapshot
        }

        private enum CodingKeys: String, CodingKey {
            case instanceSnapshot = "instanceSnapshot"
        }
    }

    public struct GetInstanceSnapshotsRequest: AWSEncodableShape {
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetInstanceSnapshots request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?

        @inlinable
        public init(pageToken: String? = nil) {
            self.pageToken = pageToken
        }

        private enum CodingKeys: String, CodingKey {
            case pageToken = "pageToken"
        }
    }

    public struct GetInstanceSnapshotsResult: AWSDecodableShape {
        /// An array of key-value pairs containing information about the results of your get instance snapshots request.
        public let instanceSnapshots: [InstanceSnapshot]?
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetInstanceSnapshots request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?

        @inlinable
        public init(instanceSnapshots: [InstanceSnapshot]? = nil, nextPageToken: String? = nil) {
            self.instanceSnapshots = instanceSnapshots
            self.nextPageToken = nextPageToken
        }

        private enum CodingKeys: String, CodingKey {
            case instanceSnapshots = "instanceSnapshots"
            case nextPageToken = "nextPageToken"
        }
    }

    public struct GetInstanceStateRequest: AWSEncodableShape {
        /// The name of the instance to get state information about.
        public let instanceName: String

        @inlinable
        public init(instanceName: String) {
            self.instanceName = instanceName
        }

        public func validate(name: String) throws {
            try self.validate(self.instanceName, name: "instanceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case instanceName = "instanceName"
        }
    }

    public struct GetInstanceStateResult: AWSDecodableShape {
        /// The state of the instance.
        public let state: InstanceState?

        @inlinable
        public init(state: InstanceState? = nil) {
            self.state = state
        }

        private enum CodingKeys: String, CodingKey {
            case state = "state"
        }
    }

    public struct GetInstancesRequest: AWSEncodableShape {
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetInstances request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?

        @inlinable
        public init(pageToken: String? = nil) {
            self.pageToken = pageToken
        }

        private enum CodingKeys: String, CodingKey {
            case pageToken = "pageToken"
        }
    }

    public struct GetInstancesResult: AWSDecodableShape {
        /// An array of key-value pairs containing information about your instances.
        public let instances: [Instance]?
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetInstances request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?

        @inlinable
        public init(instances: [Instance]? = nil, nextPageToken: String? = nil) {
            self.instances = instances
            self.nextPageToken = nextPageToken
        }

        private enum CodingKeys: String, CodingKey {
            case instances = "instances"
            case nextPageToken = "nextPageToken"
        }
    }

    public struct GetKeyPairRequest: AWSEncodableShape {
        /// The name of the key pair for which you are requesting information.
        public let keyPairName: String

        @inlinable
        public init(keyPairName: String) {
            self.keyPairName = keyPairName
        }

        public func validate(name: String) throws {
            try self.validate(self.keyPairName, name: "keyPairName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case keyPairName = "keyPairName"
        }
    }

    public struct GetKeyPairResult: AWSDecodableShape {
        /// An array of key-value pairs containing information about the key pair.
        public let keyPair: KeyPair?

        @inlinable
        public init(keyPair: KeyPair? = nil) {
            self.keyPair = keyPair
        }

        private enum CodingKeys: String, CodingKey {
            case keyPair = "keyPair"
        }
    }

    public struct GetKeyPairsRequest: AWSEncodableShape {
        /// A Boolean value that indicates whether to include the default key pair in the response of your request.
        public let includeDefaultKeyPair: Bool?
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetKeyPairs request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?

        @inlinable
        public init(includeDefaultKeyPair: Bool? = nil, pageToken: String? = nil) {
            self.includeDefaultKeyPair = includeDefaultKeyPair
            self.pageToken = pageToken
        }

        private enum CodingKeys: String, CodingKey {
            case includeDefaultKeyPair = "includeDefaultKeyPair"
            case pageToken = "pageToken"
        }
    }

    public struct GetKeyPairsResult: AWSDecodableShape {
        /// An array of key-value pairs containing information about the key pairs.
        public let keyPairs: [KeyPair]?
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetKeyPairs request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?

        @inlinable
        public init(keyPairs: [KeyPair]? = nil, nextPageToken: String? = nil) {
            self.keyPairs = keyPairs
            self.nextPageToken = nextPageToken
        }

        private enum CodingKeys: String, CodingKey {
            case keyPairs = "keyPairs"
            case nextPageToken = "nextPageToken"
        }
    }

    public struct GetLoadBalancerMetricDataRequest: AWSEncodableShape {
        /// The end time of the period.
        public let endTime: Date
        /// The name of the load balancer.
        public let loadBalancerName: String
        /// The metric for which you want to return information. Valid load balancer metric names are listed below, along with the most useful statistics to include in your request, and the published unit value.     ClientTLSNegotiationErrorCount - The number of TLS connections initiated by the client that did not establish a session with the load balancer due to a TLS error generated by the load balancer. Possible causes include a mismatch of ciphers or protocols.  Statistics: The most useful statistic is Sum.  Unit: The published unit is Count.     HealthyHostCount - The number of target instances that are considered healthy.  Statistics: The most useful statistic are Average, Minimum, and Maximum.  Unit: The published unit is Count.     HTTPCode_Instance_2XX_Count - The number of HTTP 2XX response codes generated by the target instances. This does not include any response codes generated by the load balancer.  Statistics: The most useful statistic is Sum. Note that Minimum, Maximum, and Average all return 1.  Unit: The published unit is Count.     HTTPCode_Instance_3XX_Count - The number of HTTP 3XX response codes generated by the target instances. This does not include any response codes generated by the load balancer.  Statistics: The most useful statistic is Sum. Note that Minimum, Maximum, and Average all return 1.  Unit: The published unit is Count.     HTTPCode_Instance_4XX_Count - The number of HTTP 4XX response codes generated by the target instances. This does not include any response codes generated by the load balancer.  Statistics: The most useful statistic is Sum. Note that Minimum, Maximum, and Average all return 1.  Unit: The published unit is Count.     HTTPCode_Instance_5XX_Count - The number of HTTP 5XX response codes generated by the target instances. This does not include any response codes generated by the load balancer.  Statistics: The most useful statistic is Sum. Note that Minimum, Maximum, and Average all return 1.  Unit: The published unit is Count.     HTTPCode_LB_4XX_Count - The number of HTTP 4XX client error codes that originated from the load balancer. Client errors are generated when requests are malformed or incomplete. These requests were not received by the target instance. This count does not include response codes generated by the target instances.  Statistics: The most useful statistic is Sum. Note that Minimum, Maximum, and Average all return 1.  Unit: The published unit is Count.     HTTPCode_LB_5XX_Count - The number of HTTP 5XX server error codes that originated from the load balancer. This does not include any response codes generated by the target instance. This metric is reported if there are no healthy instances attached to the load balancer, or if the request rate exceeds the capacity of the instances (spillover) or the load balancer.  Statistics: The most useful statistic is Sum. Note that Minimum, Maximum, and Average all return 1.  Unit: The published unit is Count.     InstanceResponseTime - The time elapsed, in seconds, after the request leaves the load balancer until a response from the target instance is received.  Statistics: The most useful statistic is Average.  Unit: The published unit is Seconds.     RejectedConnectionCount - The number of connections that were rejected because the load balancer had reached its maximum number of connections.  Statistics: The most useful statistic is Sum.  Unit: The published unit is Count.     RequestCount - The number of requests processed over IPv4. This count includes only the requests with a response generated by a target instance of the load balancer.  Statistics: The most useful statistic is Sum. Note that Minimum, Maximum, and Average all return 1.  Unit: The published unit is Count.     UnhealthyHostCount - The number of target instances that are considered unhealthy.  Statistics: The most useful statistic are Average, Minimum, and Maximum.  Unit: The published unit is Count.
        public let metricName: LoadBalancerMetricName
        /// The granularity, in seconds, of the returned data points.
        public let period: Int
        /// The start time of the period.
        public let startTime: Date
        /// The statistic for the metric. The following statistics are available:    Minimum - The lowest value observed during the specified period. Use this value to determine low volumes of activity for your application.    Maximum - The highest value observed during the specified period. Use this value to determine high volumes of activity for your application.    Sum - All values submitted for the matching metric added together. You can use this statistic to determine the total volume of a metric.    Average - The value of Sum / SampleCount during the specified period. By comparing this statistic with the Minimum and Maximum values, you can determine the full scope of a metric and how close the average use is to the Minimum and Maximum values. This comparison helps you to know when to increase or decrease your resources.    SampleCount - The count, or number, of data points used for the statistical calculation.
        public let statistics: [MetricStatistic]
        /// The unit for the metric data request. Valid units depend on the metric data being requested. For the valid units with each available metric, see the metricName parameter.
        public let unit: MetricUnit

        @inlinable
        public init(endTime: Date, loadBalancerName: String, metricName: LoadBalancerMetricName, period: Int, startTime: Date, statistics: [MetricStatistic], unit: MetricUnit) {
            self.endTime = endTime
            self.loadBalancerName = loadBalancerName
            self.metricName = metricName
            self.period = period
            self.startTime = startTime
            self.statistics = statistics
            self.unit = unit
        }

        public func validate(name: String) throws {
            try self.validate(self.loadBalancerName, name: "loadBalancerName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.period, name: "period", parent: name, max: 86400)
            try self.validate(self.period, name: "period", parent: name, min: 60)
        }

        private enum CodingKeys: String, CodingKey {
            case endTime = "endTime"
            case loadBalancerName = "loadBalancerName"
            case metricName = "metricName"
            case period = "period"
            case startTime = "startTime"
            case statistics = "statistics"
            case unit = "unit"
        }
    }

    public struct GetLoadBalancerMetricDataResult: AWSDecodableShape {
        /// An array of objects that describe the metric data returned.
        public let metricData: [MetricDatapoint]?
        /// The name of the metric returned.
        public let metricName: LoadBalancerMetricName?

        @inlinable
        public init(metricData: [MetricDatapoint]? = nil, metricName: LoadBalancerMetricName? = nil) {
            self.metricData = metricData
            self.metricName = metricName
        }

        private enum CodingKeys: String, CodingKey {
            case metricData = "metricData"
            case metricName = "metricName"
        }
    }

    public struct GetLoadBalancerRequest: AWSEncodableShape {
        /// The name of the load balancer.
        public let loadBalancerName: String

        @inlinable
        public init(loadBalancerName: String) {
            self.loadBalancerName = loadBalancerName
        }

        public func validate(name: String) throws {
            try self.validate(self.loadBalancerName, name: "loadBalancerName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancerName = "loadBalancerName"
        }
    }

    public struct GetLoadBalancerResult: AWSDecodableShape {
        /// An object containing information about your load balancer.
        public let loadBalancer: LoadBalancer?

        @inlinable
        public init(loadBalancer: LoadBalancer? = nil) {
            self.loadBalancer = loadBalancer
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancer = "loadBalancer"
        }
    }

    public struct GetLoadBalancerTlsCertificatesRequest: AWSEncodableShape {
        /// The name of the load balancer you associated with your SSL/TLS certificate.
        public let loadBalancerName: String

        @inlinable
        public init(loadBalancerName: String) {
            self.loadBalancerName = loadBalancerName
        }

        public func validate(name: String) throws {
            try self.validate(self.loadBalancerName, name: "loadBalancerName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancerName = "loadBalancerName"
        }
    }

    public struct GetLoadBalancerTlsCertificatesResult: AWSDecodableShape {
        /// An array of LoadBalancerTlsCertificate objects describing your SSL/TLS certificates.
        public let tlsCertificates: [LoadBalancerTlsCertificate]?

        @inlinable
        public init(tlsCertificates: [LoadBalancerTlsCertificate]? = nil) {
            self.tlsCertificates = tlsCertificates
        }

        private enum CodingKeys: String, CodingKey {
            case tlsCertificates = "tlsCertificates"
        }
    }

    public struct GetLoadBalancerTlsPoliciesRequest: AWSEncodableShape {
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetLoadBalancerTlsPolicies request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?

        @inlinable
        public init(pageToken: String? = nil) {
            self.pageToken = pageToken
        }

        private enum CodingKeys: String, CodingKey {
            case pageToken = "pageToken"
        }
    }

    public struct GetLoadBalancerTlsPoliciesResult: AWSDecodableShape {
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetLoadBalancerTlsPolicies request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?
        /// An array of objects that describe the TLS security policies that are available.
        public let tlsPolicies: [LoadBalancerTlsPolicy]?

        @inlinable
        public init(nextPageToken: String? = nil, tlsPolicies: [LoadBalancerTlsPolicy]? = nil) {
            self.nextPageToken = nextPageToken
            self.tlsPolicies = tlsPolicies
        }

        private enum CodingKeys: String, CodingKey {
            case nextPageToken = "nextPageToken"
            case tlsPolicies = "tlsPolicies"
        }
    }

    public struct GetLoadBalancersRequest: AWSEncodableShape {
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetLoadBalancers request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?

        @inlinable
        public init(pageToken: String? = nil) {
            self.pageToken = pageToken
        }

        private enum CodingKeys: String, CodingKey {
            case pageToken = "pageToken"
        }
    }

    public struct GetLoadBalancersResult: AWSDecodableShape {
        /// An array of LoadBalancer objects describing your load balancers.
        public let loadBalancers: [LoadBalancer]?
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetLoadBalancers request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?

        @inlinable
        public init(loadBalancers: [LoadBalancer]? = nil, nextPageToken: String? = nil) {
            self.loadBalancers = loadBalancers
            self.nextPageToken = nextPageToken
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancers = "loadBalancers"
            case nextPageToken = "nextPageToken"
        }
    }

    public struct GetOperationRequest: AWSEncodableShape {
        /// A GUID used to identify the operation.
        public let operationId: String

        @inlinable
        public init(operationId: String) {
            self.operationId = operationId
        }

        public func validate(name: String) throws {
            try self.validate(self.operationId, name: "operationId", parent: name, pattern: "\\S")
        }

        private enum CodingKeys: String, CodingKey {
            case operationId = "operationId"
        }
    }

    public struct GetOperationResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operation: Operation?

        @inlinable
        public init(operation: Operation? = nil) {
            self.operation = operation
        }

        private enum CodingKeys: String, CodingKey {
            case operation = "operation"
        }
    }

    public struct GetOperationsForResourceRequest: AWSEncodableShape {
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetOperationsForResource request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?
        /// The name of the resource for which you are requesting information.
        public let resourceName: String

        @inlinable
        public init(pageToken: String? = nil, resourceName: String) {
            self.pageToken = pageToken
            self.resourceName = resourceName
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceName, name: "resourceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case pageToken = "pageToken"
            case resourceName = "resourceName"
        }
    }

    public struct GetOperationsForResourceResult: AWSDecodableShape {
        /// (Discontinued) Returns the number of pages of results that remain.  In releases prior to June 12, 2017, this parameter returned null by the API. It is now discontinued, and the API returns the next page token parameter instead.
        public let nextPageCount: String?
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetOperationsForResource request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(nextPageToken: String? = nil, operations: [Operation]? = nil) {
            self.nextPageCount = nil
            self.nextPageToken = nextPageToken
            self.operations = operations
        }

        @available(*, deprecated, message: "Members nextPageCount have been deprecated")
        @inlinable
        public init(nextPageCount: String? = nil, nextPageToken: String? = nil, operations: [Operation]? = nil) {
            self.nextPageCount = nextPageCount
            self.nextPageToken = nextPageToken
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case nextPageCount = "nextPageCount"
            case nextPageToken = "nextPageToken"
            case operations = "operations"
        }
    }

    public struct GetOperationsRequest: AWSEncodableShape {
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetOperations request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?

        @inlinable
        public init(pageToken: String? = nil) {
            self.pageToken = pageToken
        }

        private enum CodingKeys: String, CodingKey {
            case pageToken = "pageToken"
        }
    }

    public struct GetOperationsResult: AWSDecodableShape {
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetOperations request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(nextPageToken: String? = nil, operations: [Operation]? = nil) {
            self.nextPageToken = nextPageToken
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case nextPageToken = "nextPageToken"
            case operations = "operations"
        }
    }

    public struct GetRegionsRequest: AWSEncodableShape {
        /// A Boolean value indicating whether to also include Availability Zones in your get regions request. Availability Zones are indicated with a letter: us-east-2a.
        public let includeAvailabilityZones: Bool?
        /// A Boolean value indicating whether to also include Availability Zones for databases in your get regions request. Availability Zones are indicated with a letter (us-east-2a).
        public let includeRelationalDatabaseAvailabilityZones: Bool?

        @inlinable
        public init(includeAvailabilityZones: Bool? = nil, includeRelationalDatabaseAvailabilityZones: Bool? = nil) {
            self.includeAvailabilityZones = includeAvailabilityZones
            self.includeRelationalDatabaseAvailabilityZones = includeRelationalDatabaseAvailabilityZones
        }

        private enum CodingKeys: String, CodingKey {
            case includeAvailabilityZones = "includeAvailabilityZones"
            case includeRelationalDatabaseAvailabilityZones = "includeRelationalDatabaseAvailabilityZones"
        }
    }

    public struct GetRegionsResult: AWSDecodableShape {
        /// An array of key-value pairs containing information about your get regions request.
        public let regions: [Region]?

        @inlinable
        public init(regions: [Region]? = nil) {
            self.regions = regions
        }

        private enum CodingKeys: String, CodingKey {
            case regions = "regions"
        }
    }

    public struct GetRelationalDatabaseBlueprintsRequest: AWSEncodableShape {
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetRelationalDatabaseBlueprints request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?

        @inlinable
        public init(pageToken: String? = nil) {
            self.pageToken = pageToken
        }

        private enum CodingKeys: String, CodingKey {
            case pageToken = "pageToken"
        }
    }

    public struct GetRelationalDatabaseBlueprintsResult: AWSDecodableShape {
        /// An object describing the result of your get relational database blueprints request.
        public let blueprints: [RelationalDatabaseBlueprint]?
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetRelationalDatabaseBlueprints request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?

        @inlinable
        public init(blueprints: [RelationalDatabaseBlueprint]? = nil, nextPageToken: String? = nil) {
            self.blueprints = blueprints
            self.nextPageToken = nextPageToken
        }

        private enum CodingKeys: String, CodingKey {
            case blueprints = "blueprints"
            case nextPageToken = "nextPageToken"
        }
    }

    public struct GetRelationalDatabaseBundlesRequest: AWSEncodableShape {
        /// A Boolean value that indicates whether to include inactive (unavailable) bundles in the response of your request.
        public let includeInactive: Bool?
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetRelationalDatabaseBundles request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?

        @inlinable
        public init(includeInactive: Bool? = nil, pageToken: String? = nil) {
            self.includeInactive = includeInactive
            self.pageToken = pageToken
        }

        private enum CodingKeys: String, CodingKey {
            case includeInactive = "includeInactive"
            case pageToken = "pageToken"
        }
    }

    public struct GetRelationalDatabaseBundlesResult: AWSDecodableShape {
        /// An object describing the result of your get relational database bundles request.
        public let bundles: [RelationalDatabaseBundle]?
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetRelationalDatabaseBundles request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?

        @inlinable
        public init(bundles: [RelationalDatabaseBundle]? = nil, nextPageToken: String? = nil) {
            self.bundles = bundles
            self.nextPageToken = nextPageToken
        }

        private enum CodingKeys: String, CodingKey {
            case bundles = "bundles"
            case nextPageToken = "nextPageToken"
        }
    }

    public struct GetRelationalDatabaseEventsRequest: AWSEncodableShape {
        /// The number of minutes in the past from which to retrieve events. For example, to get all events from the past 2 hours, enter 120. Default: 60  The minimum is 1 and the maximum is 14 days (20160 minutes).
        public let durationInMinutes: Int?
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetRelationalDatabaseEvents request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?
        /// The name of the database from which to get events.
        public let relationalDatabaseName: String

        @inlinable
        public init(durationInMinutes: Int? = nil, pageToken: String? = nil, relationalDatabaseName: String) {
            self.durationInMinutes = durationInMinutes
            self.pageToken = pageToken
            self.relationalDatabaseName = relationalDatabaseName
        }

        public func validate(name: String) throws {
            try self.validate(self.relationalDatabaseName, name: "relationalDatabaseName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case durationInMinutes = "durationInMinutes"
            case pageToken = "pageToken"
            case relationalDatabaseName = "relationalDatabaseName"
        }
    }

    public struct GetRelationalDatabaseEventsResult: AWSDecodableShape {
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetRelationalDatabaseEvents request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?
        /// An object describing the result of your get relational database events request.
        public let relationalDatabaseEvents: [RelationalDatabaseEvent]?

        @inlinable
        public init(nextPageToken: String? = nil, relationalDatabaseEvents: [RelationalDatabaseEvent]? = nil) {
            self.nextPageToken = nextPageToken
            self.relationalDatabaseEvents = relationalDatabaseEvents
        }

        private enum CodingKeys: String, CodingKey {
            case nextPageToken = "nextPageToken"
            case relationalDatabaseEvents = "relationalDatabaseEvents"
        }
    }

    public struct GetRelationalDatabaseLogEventsRequest: AWSEncodableShape {
        /// The end of the time interval from which to get log events. Constraints:   Specified in Coordinated Universal Time (UTC).   Specified in the Unix time format. For example, if you wish to use an end time of October 1, 2018, at 8 PM UTC, then you input 1538424000 as the end time.
        public let endTime: Date?
        /// The name of the log stream. Use the get relational database log streams operation to get a list of available log streams.
        public let logStreamName: String
        /// The token to advance to the next or previous page of results from your request. To get a page token, perform an initial GetRelationalDatabaseLogEvents request. If your results are paginated, the response will return a next forward token and/or next backward token that you can specify as the page token in a subsequent request.
        public let pageToken: String?
        /// The name of your database for which to get log events.
        public let relationalDatabaseName: String
        /// Parameter to specify if the log should start from head or tail. If true is specified, the log event starts from the head of the log. If false is specified, the log event starts from the tail of the log.  For PostgreSQL, the default value of false is the only option available.
        public let startFromHead: Bool?
        /// The start of the time interval from which to get log events. Constraints:   Specified in Coordinated Universal Time (UTC).   Specified in the Unix time format. For example, if you wish to use a start time of October 1, 2018, at 8 PM UTC, then you input 1538424000 as the start time.
        public let startTime: Date?

        @inlinable
        public init(endTime: Date? = nil, logStreamName: String, pageToken: String? = nil, relationalDatabaseName: String, startFromHead: Bool? = nil, startTime: Date? = nil) {
            self.endTime = endTime
            self.logStreamName = logStreamName
            self.pageToken = pageToken
            self.relationalDatabaseName = relationalDatabaseName
            self.startFromHead = startFromHead
            self.startTime = startTime
        }

        public func validate(name: String) throws {
            try self.validate(self.relationalDatabaseName, name: "relationalDatabaseName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case endTime = "endTime"
            case logStreamName = "logStreamName"
            case pageToken = "pageToken"
            case relationalDatabaseName = "relationalDatabaseName"
            case startFromHead = "startFromHead"
            case startTime = "startTime"
        }
    }

    public struct GetRelationalDatabaseLogEventsResult: AWSDecodableShape {
        /// A token used for advancing to the previous page of results from your get relational database log events request.
        public let nextBackwardToken: String?
        /// A token used for advancing to the next page of results from your get relational database log events request.
        public let nextForwardToken: String?
        /// An object describing the result of your get relational database log events request.
        public let resourceLogEvents: [LogEvent]?

        @inlinable
        public init(nextBackwardToken: String? = nil, nextForwardToken: String? = nil, resourceLogEvents: [LogEvent]? = nil) {
            self.nextBackwardToken = nextBackwardToken
            self.nextForwardToken = nextForwardToken
            self.resourceLogEvents = resourceLogEvents
        }

        private enum CodingKeys: String, CodingKey {
            case nextBackwardToken = "nextBackwardToken"
            case nextForwardToken = "nextForwardToken"
            case resourceLogEvents = "resourceLogEvents"
        }
    }

    public struct GetRelationalDatabaseLogStreamsRequest: AWSEncodableShape {
        /// The name of your database for which to get log streams.
        public let relationalDatabaseName: String

        @inlinable
        public init(relationalDatabaseName: String) {
            self.relationalDatabaseName = relationalDatabaseName
        }

        public func validate(name: String) throws {
            try self.validate(self.relationalDatabaseName, name: "relationalDatabaseName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case relationalDatabaseName = "relationalDatabaseName"
        }
    }

    public struct GetRelationalDatabaseLogStreamsResult: AWSDecodableShape {
        /// An object describing the result of your get relational database log streams request.
        public let logStreams: [String]?

        @inlinable
        public init(logStreams: [String]? = nil) {
            self.logStreams = logStreams
        }

        private enum CodingKeys: String, CodingKey {
            case logStreams = "logStreams"
        }
    }

    public struct GetRelationalDatabaseMasterUserPasswordRequest: AWSEncodableShape {
        /// The password version to return. Specifying CURRENT or PREVIOUS returns the current or previous passwords respectively. Specifying PENDING returns the newest version of the password that will rotate to CURRENT. After the PENDING password rotates to CURRENT, the PENDING password is no longer available. Default: CURRENT
        public let passwordVersion: RelationalDatabasePasswordVersion?
        /// The name of your database for which to get the master user password.
        public let relationalDatabaseName: String

        @inlinable
        public init(passwordVersion: RelationalDatabasePasswordVersion? = nil, relationalDatabaseName: String) {
            self.passwordVersion = passwordVersion
            self.relationalDatabaseName = relationalDatabaseName
        }

        public func validate(name: String) throws {
            try self.validate(self.relationalDatabaseName, name: "relationalDatabaseName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case passwordVersion = "passwordVersion"
            case relationalDatabaseName = "relationalDatabaseName"
        }
    }

    public struct GetRelationalDatabaseMasterUserPasswordResult: AWSDecodableShape {
        /// The timestamp when the specified version of the master user password was created.
        public let createdAt: Date?
        /// The master user password for the password version specified.
        public let masterUserPassword: String?

        @inlinable
        public init(createdAt: Date? = nil, masterUserPassword: String? = nil) {
            self.createdAt = createdAt
            self.masterUserPassword = masterUserPassword
        }

        private enum CodingKeys: String, CodingKey {
            case createdAt = "createdAt"
            case masterUserPassword = "masterUserPassword"
        }
    }

    public struct GetRelationalDatabaseMetricDataRequest: AWSEncodableShape {
        /// The end of the time interval from which to get metric data. Constraints:   Specified in Coordinated Universal Time (UTC).   Specified in the Unix time format. For example, if you wish to use an end time of October 1, 2018, at 8 PM UTC, then you input 1538424000 as the end time.
        public let endTime: Date
        /// The metric for which you want to return information. Valid relational database metric names are listed below, along with the most useful statistics to include in your request, and the published unit value. All relational database metric data is available in 1-minute (60 seconds) granularity.     CPUUtilization - The percentage of CPU utilization currently in use on the database.  Statistics: The most useful statistics are Maximum and Average.  Unit: The published unit is Percent.     DatabaseConnections - The number of database connections in use.  Statistics: The most useful statistics are Maximum and Sum.  Unit: The published unit is Count.     DiskQueueDepth - The number of outstanding IOs (read/write requests) that are waiting to access the disk.  Statistics: The most useful statistic is Sum.  Unit: The published unit is Count.     FreeStorageSpace - The amount of available storage space.  Statistics: The most useful statistic is Sum.  Unit: The published unit is Bytes.     NetworkReceiveThroughput - The incoming (Receive) network traffic on the database, including both customer database traffic and AWS traffic used for monitoring and replication.  Statistics: The most useful statistic is Average.  Unit: The published unit is Bytes/Second.     NetworkTransmitThroughput - The outgoing (Transmit) network traffic on the database, including both customer database traffic and AWS traffic used for monitoring and replication.  Statistics: The most useful statistic is Average.  Unit: The published unit is Bytes/Second.
        public let metricName: RelationalDatabaseMetricName
        /// The granularity, in seconds, of the returned data points. All relational database metric data is available in 1-minute (60 seconds) granularity.
        public let period: Int
        /// The name of your database from which to get metric data.
        public let relationalDatabaseName: String
        /// The start of the time interval from which to get metric data. Constraints:   Specified in Coordinated Universal Time (UTC).   Specified in the Unix time format. For example, if you wish to use a start time of October 1, 2018, at 8 PM UTC, then you input 1538424000 as the start time.
        public let startTime: Date
        /// The statistic for the metric. The following statistics are available:    Minimum - The lowest value observed during the specified period. Use this value to determine low volumes of activity for your application.    Maximum - The highest value observed during the specified period. Use this value to determine high volumes of activity for your application.    Sum - All values submitted for the matching metric added together. You can use this statistic to determine the total volume of a metric.    Average - The value of Sum / SampleCount during the specified period. By comparing this statistic with the Minimum and Maximum values, you can determine the full scope of a metric and how close the average use is to the Minimum and Maximum values. This comparison helps you to know when to increase or decrease your resources.    SampleCount - The count, or number, of data points used for the statistical calculation.
        public let statistics: [MetricStatistic]
        /// The unit for the metric data request. Valid units depend on the metric data being requested. For the valid units with each available metric, see the metricName parameter.
        public let unit: MetricUnit

        @inlinable
        public init(endTime: Date, metricName: RelationalDatabaseMetricName, period: Int, relationalDatabaseName: String, startTime: Date, statistics: [MetricStatistic], unit: MetricUnit) {
            self.endTime = endTime
            self.metricName = metricName
            self.period = period
            self.relationalDatabaseName = relationalDatabaseName
            self.startTime = startTime
            self.statistics = statistics
            self.unit = unit
        }

        public func validate(name: String) throws {
            try self.validate(self.period, name: "period", parent: name, max: 86400)
            try self.validate(self.period, name: "period", parent: name, min: 60)
            try self.validate(self.relationalDatabaseName, name: "relationalDatabaseName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case endTime = "endTime"
            case metricName = "metricName"
            case period = "period"
            case relationalDatabaseName = "relationalDatabaseName"
            case startTime = "startTime"
            case statistics = "statistics"
            case unit = "unit"
        }
    }

    public struct GetRelationalDatabaseMetricDataResult: AWSDecodableShape {
        /// An array of objects that describe the metric data returned.
        public let metricData: [MetricDatapoint]?
        /// The name of the metric returned.
        public let metricName: RelationalDatabaseMetricName?

        @inlinable
        public init(metricData: [MetricDatapoint]? = nil, metricName: RelationalDatabaseMetricName? = nil) {
            self.metricData = metricData
            self.metricName = metricName
        }

        private enum CodingKeys: String, CodingKey {
            case metricData = "metricData"
            case metricName = "metricName"
        }
    }

    public struct GetRelationalDatabaseParametersRequest: AWSEncodableShape {
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetRelationalDatabaseParameters request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?
        /// The name of your database for which to get parameters.
        public let relationalDatabaseName: String

        @inlinable
        public init(pageToken: String? = nil, relationalDatabaseName: String) {
            self.pageToken = pageToken
            self.relationalDatabaseName = relationalDatabaseName
        }

        public func validate(name: String) throws {
            try self.validate(self.relationalDatabaseName, name: "relationalDatabaseName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case pageToken = "pageToken"
            case relationalDatabaseName = "relationalDatabaseName"
        }
    }

    public struct GetRelationalDatabaseParametersResult: AWSDecodableShape {
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetRelationalDatabaseParameters request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?
        /// An object describing the result of your get relational database parameters request.
        public let parameters: [RelationalDatabaseParameter]?

        @inlinable
        public init(nextPageToken: String? = nil, parameters: [RelationalDatabaseParameter]? = nil) {
            self.nextPageToken = nextPageToken
            self.parameters = parameters
        }

        private enum CodingKeys: String, CodingKey {
            case nextPageToken = "nextPageToken"
            case parameters = "parameters"
        }
    }

    public struct GetRelationalDatabaseRequest: AWSEncodableShape {
        /// The name of the database that you are looking up.
        public let relationalDatabaseName: String

        @inlinable
        public init(relationalDatabaseName: String) {
            self.relationalDatabaseName = relationalDatabaseName
        }

        public func validate(name: String) throws {
            try self.validate(self.relationalDatabaseName, name: "relationalDatabaseName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case relationalDatabaseName = "relationalDatabaseName"
        }
    }

    public struct GetRelationalDatabaseResult: AWSDecodableShape {
        /// An object describing the specified database.
        public let relationalDatabase: RelationalDatabase?

        @inlinable
        public init(relationalDatabase: RelationalDatabase? = nil) {
            self.relationalDatabase = relationalDatabase
        }

        private enum CodingKeys: String, CodingKey {
            case relationalDatabase = "relationalDatabase"
        }
    }

    public struct GetRelationalDatabaseSnapshotRequest: AWSEncodableShape {
        /// The name of the database snapshot for which to get information.
        public let relationalDatabaseSnapshotName: String

        @inlinable
        public init(relationalDatabaseSnapshotName: String) {
            self.relationalDatabaseSnapshotName = relationalDatabaseSnapshotName
        }

        public func validate(name: String) throws {
            try self.validate(self.relationalDatabaseSnapshotName, name: "relationalDatabaseSnapshotName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case relationalDatabaseSnapshotName = "relationalDatabaseSnapshotName"
        }
    }

    public struct GetRelationalDatabaseSnapshotResult: AWSDecodableShape {
        /// An object describing the specified database snapshot.
        public let relationalDatabaseSnapshot: RelationalDatabaseSnapshot?

        @inlinable
        public init(relationalDatabaseSnapshot: RelationalDatabaseSnapshot? = nil) {
            self.relationalDatabaseSnapshot = relationalDatabaseSnapshot
        }

        private enum CodingKeys: String, CodingKey {
            case relationalDatabaseSnapshot = "relationalDatabaseSnapshot"
        }
    }

    public struct GetRelationalDatabaseSnapshotsRequest: AWSEncodableShape {
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetRelationalDatabaseSnapshots request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?

        @inlinable
        public init(pageToken: String? = nil) {
            self.pageToken = pageToken
        }

        private enum CodingKeys: String, CodingKey {
            case pageToken = "pageToken"
        }
    }

    public struct GetRelationalDatabaseSnapshotsResult: AWSDecodableShape {
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetRelationalDatabaseSnapshots request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?
        /// An object describing the result of your get relational database snapshots request.
        public let relationalDatabaseSnapshots: [RelationalDatabaseSnapshot]?

        @inlinable
        public init(nextPageToken: String? = nil, relationalDatabaseSnapshots: [RelationalDatabaseSnapshot]? = nil) {
            self.nextPageToken = nextPageToken
            self.relationalDatabaseSnapshots = relationalDatabaseSnapshots
        }

        private enum CodingKeys: String, CodingKey {
            case nextPageToken = "nextPageToken"
            case relationalDatabaseSnapshots = "relationalDatabaseSnapshots"
        }
    }

    public struct GetRelationalDatabasesRequest: AWSEncodableShape {
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetRelationalDatabases request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?

        @inlinable
        public init(pageToken: String? = nil) {
            self.pageToken = pageToken
        }

        private enum CodingKeys: String, CodingKey {
            case pageToken = "pageToken"
        }
    }

    public struct GetRelationalDatabasesResult: AWSDecodableShape {
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetRelationalDatabases request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?
        /// An object describing the result of your get relational databases request.
        public let relationalDatabases: [RelationalDatabase]?

        @inlinable
        public init(nextPageToken: String? = nil, relationalDatabases: [RelationalDatabase]? = nil) {
            self.nextPageToken = nextPageToken
            self.relationalDatabases = relationalDatabases
        }

        private enum CodingKeys: String, CodingKey {
            case nextPageToken = "nextPageToken"
            case relationalDatabases = "relationalDatabases"
        }
    }

    public struct GetSetupHistoryRequest: AWSEncodableShape {
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetSetupHistory request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?
        /// The name of the resource for which you are requesting information.
        public let resourceName: String

        @inlinable
        public init(pageToken: String? = nil, resourceName: String) {
            self.pageToken = pageToken
            self.resourceName = resourceName
        }

        public func validate(name: String) throws {
            try self.validate(self.pageToken, name: "pageToken", parent: name, max: 40)
            try self.validate(self.pageToken, name: "pageToken", parent: name, min: 24)
            try self.validate(self.pageToken, name: "pageToken", parent: name, pattern: "^[A-Za-z0-9+/=]+$")
            try self.validate(self.resourceName, name: "resourceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case pageToken = "pageToken"
            case resourceName = "resourceName"
        }
    }

    public struct GetSetupHistoryResult: AWSDecodableShape {
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetSetupHistory request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?
        /// The historical information that's returned.
        public let setupHistory: [SetupHistory]?

        @inlinable
        public init(nextPageToken: String? = nil, setupHistory: [SetupHistory]? = nil) {
            self.nextPageToken = nextPageToken
            self.setupHistory = setupHistory
        }

        private enum CodingKeys: String, CodingKey {
            case nextPageToken = "nextPageToken"
            case setupHistory = "setupHistory"
        }
    }

    public struct GetStaticIpRequest: AWSEncodableShape {
        /// The name of the static IP in Lightsail.
        public let staticIpName: String

        @inlinable
        public init(staticIpName: String) {
            self.staticIpName = staticIpName
        }

        public func validate(name: String) throws {
            try self.validate(self.staticIpName, name: "staticIpName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case staticIpName = "staticIpName"
        }
    }

    public struct GetStaticIpResult: AWSDecodableShape {
        /// An array of key-value pairs containing information about the requested static IP.
        public let staticIp: StaticIp?

        @inlinable
        public init(staticIp: StaticIp? = nil) {
            self.staticIp = staticIp
        }

        private enum CodingKeys: String, CodingKey {
            case staticIp = "staticIp"
        }
    }

    public struct GetStaticIpsRequest: AWSEncodableShape {
        /// The token to advance to the next page of results from your request. To get a page token, perform an initial GetStaticIps request. If your results are paginated, the response will return a next page token that you can specify as the page token in a subsequent request.
        public let pageToken: String?

        @inlinable
        public init(pageToken: String? = nil) {
            self.pageToken = pageToken
        }

        private enum CodingKeys: String, CodingKey {
            case pageToken = "pageToken"
        }
    }

    public struct GetStaticIpsResult: AWSDecodableShape {
        /// The token to advance to the next page of results from your request. A next page token is not returned if there are no more results to display. To get the next page of results, perform another GetStaticIps request and specify the next page token using the pageToken parameter.
        public let nextPageToken: String?
        /// An array of key-value pairs containing information about your get static IPs request.
        public let staticIps: [StaticIp]?

        @inlinable
        public init(nextPageToken: String? = nil, staticIps: [StaticIp]? = nil) {
            self.nextPageToken = nextPageToken
            self.staticIps = staticIps
        }

        private enum CodingKeys: String, CodingKey {
            case nextPageToken = "nextPageToken"
            case staticIps = "staticIps"
        }
    }

    public struct HeaderObject: AWSEncodableShape & AWSDecodableShape {
        /// The specific headers to forward to your distribution's origin.
        public let headersAllowList: [HeaderEnum]?
        /// The headers that you want your distribution to forward to your origin and base caching on. You can configure your distribution to do one of the following:     all - Forward all headers to your origin.     none - Forward only the default headers.     allow-list - Forward only the headers you specify using the headersAllowList parameter.
        public let option: ForwardValues?

        @inlinable
        public init(headersAllowList: [HeaderEnum]? = nil, option: ForwardValues? = nil) {
            self.headersAllowList = headersAllowList
            self.option = option
        }

        private enum CodingKeys: String, CodingKey {
            case headersAllowList = "headersAllowList"
            case option = "option"
        }
    }

    public struct HostKeyAttributes: AWSDecodableShape {
        /// The SSH host key algorithm or the RDP certificate format. For SSH host keys, the algorithm may be ssh-rsa, ecdsa-sha2-nistp256, ssh-ed25519, etc. For RDP certificates, the algorithm is always x509-cert.
        public let algorithm: String?
        /// The SHA-1 fingerprint of the returned SSH host key or RDP certificate.   Example of an SHA-1 SSH fingerprint:  SHA1:1CHH6FaAaXjtFOsR/t83vf91SR0    Example of an SHA-1 RDP fingerprint:  af:34:51:fe:09:f0:e0:da:b8:4e:56:ca:60:c2:10:ff:38:06:db:45
        public let fingerprintSHA1: String?
        /// The SHA-256 fingerprint of the returned SSH host key or RDP certificate.   Example of an SHA-256 SSH fingerprint:  SHA256:KTsMnRBh1IhD17HpdfsbzeGA4jOijm5tyXsMjKVbB8o    Example of an SHA-256 RDP fingerprint:  03:9b:36:9f:4b:de:4e:61:70:fc:7c:c9:78:e7:d2:1a:1c:25:a8:0c:91:f6:7c:e4:d6:a0:85:c8:b4:53:99:68
        public let fingerprintSHA256: String?
        /// The returned RDP certificate is not valid after this point in time. This value is listed only for RDP certificates.
        public let notValidAfter: Date?
        /// The returned RDP certificate is valid after this point in time. This value is listed only for RDP certificates.
        public let notValidBefore: Date?
        /// The public SSH host key or the RDP certificate.
        public let publicKey: String?
        /// The time that the SSH host key or RDP certificate was recorded by Lightsail.
        public let witnessedAt: Date?

        @inlinable
        public init(algorithm: String? = nil, fingerprintSHA1: String? = nil, fingerprintSHA256: String? = nil, notValidAfter: Date? = nil, notValidBefore: Date? = nil, publicKey: String? = nil, witnessedAt: Date? = nil) {
            self.algorithm = algorithm
            self.fingerprintSHA1 = fingerprintSHA1
            self.fingerprintSHA256 = fingerprintSHA256
            self.notValidAfter = notValidAfter
            self.notValidBefore = notValidBefore
            self.publicKey = publicKey
            self.witnessedAt = witnessedAt
        }

        private enum CodingKeys: String, CodingKey {
            case algorithm = "algorithm"
            case fingerprintSHA1 = "fingerprintSHA1"
            case fingerprintSHA256 = "fingerprintSHA256"
            case notValidAfter = "notValidAfter"
            case notValidBefore = "notValidBefore"
            case publicKey = "publicKey"
            case witnessedAt = "witnessedAt"
        }
    }

    public struct ImportKeyPairRequest: AWSEncodableShape {
        /// The name of the key pair for which you want to import the public key.
        public let keyPairName: String
        /// A base64-encoded public key of the ssh-rsa type.
        public let publicKeyBase64: String

        @inlinable
        public init(keyPairName: String, publicKeyBase64: String) {
            self.keyPairName = keyPairName
            self.publicKeyBase64 = publicKeyBase64
        }

        public func validate(name: String) throws {
            try self.validate(self.keyPairName, name: "keyPairName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case keyPairName = "keyPairName"
            case publicKeyBase64 = "publicKeyBase64"
        }
    }

    public struct ImportKeyPairResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operation: Operation?

        @inlinable
        public init(operation: Operation? = nil) {
            self.operation = operation
        }

        private enum CodingKeys: String, CodingKey {
            case operation = "operation"
        }
    }

    public struct InputOrigin: AWSEncodableShape {
        /// The name of the origin resource.
        public let name: String?
        /// The protocol that your Amazon Lightsail distribution uses when establishing a connection with your origin to pull content.
        public let protocolPolicy: OriginProtocolPolicyEnum?
        /// The AWS Region name of the origin resource.
        public let regionName: RegionName?
        /// The amount of time, in seconds, that the distribution waits for a response after forwarding a request to the origin. The minimum timeout is 1 second, the maximum is 60 seconds, and the default (if you don't specify otherwise) is 30 seconds.
        public let responseTimeout: Int?

        @inlinable
        public init(name: String? = nil, protocolPolicy: OriginProtocolPolicyEnum? = nil, regionName: RegionName? = nil, responseTimeout: Int? = nil) {
            self.name = name
            self.protocolPolicy = protocolPolicy
            self.regionName = regionName
            self.responseTimeout = responseTimeout
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case name = "name"
            case protocolPolicy = "protocolPolicy"
            case regionName = "regionName"
            case responseTimeout = "responseTimeout"
        }
    }

    public struct Instance: AWSDecodableShape {
        /// An array of objects representing the add-ons enabled on the instance.
        public let addOns: [AddOn]?
        /// The Amazon Resource Name (ARN) of the instance (arn:aws:lightsail:us-east-2:123456789101:Instance/244ad76f-8aad-4741-809f-12345EXAMPLE).
        public let arn: String?
        /// The blueprint ID (amazon_linux_2023).
        public let blueprintId: String?
        /// The friendly name of the blueprint (Amazon Linux 2023).
        public let blueprintName: String?
        /// The bundle for the instance (micro_x_x).
        public let bundleId: String?
        /// The timestamp when the instance was created (1479734909.17) in Unix time format.
        public let createdAt: Date?
        /// The size of the vCPU and the amount of RAM for the instance.
        public let hardware: InstanceHardware?
        /// The IP address type of the instance. The possible values are ipv4 for IPv4 only, ipv6 for IPv6 only, and dualstack for IPv4 and IPv6.
        public let ipAddressType: IpAddressType?
        /// The IPv6 addresses of the instance.
        public let ipv6Addresses: [String]?
        /// A Boolean value indicating whether this instance has a static IP assigned to it.
        public let isStaticIp: Bool?
        /// The region name and Availability Zone where the instance is located.
        public let location: ResourceLocation?
        /// The metadata options for the Amazon Lightsail instance.
        public let metadataOptions: InstanceMetadataOptions?
        /// The name the user gave the instance (Amazon_Linux_2023-1).
        public let name: String?
        /// Information about the public ports and monthly data transfer rates for the instance.
        public let networking: InstanceNetworking?
        /// The private IP address of the instance.
        public let privateIpAddress: String?
        /// The public IP address of the instance.
        public let publicIpAddress: String?
        /// The type of resource (usually Instance).
        public let resourceType: ResourceType?
        /// The name of the SSH key being used to connect to the instance (LightsailDefaultKeyPair).
        public let sshKeyName: String?
        /// The status code and the state (running) for the instance.
        public let state: InstanceState?
        /// The support code. Include this code in your email to support when you have questions about an instance or another resource in Lightsail. This code enables our support team to look up your Lightsail information more easily.
        public let supportCode: String?
        /// The tag keys and optional values for the resource. For more information about tags in Lightsail, see the Amazon Lightsail Developer Guide.
        public let tags: [Tag]?
        /// The user name for connecting to the instance (ec2-user).
        public let username: String?

        @inlinable
        public init(addOns: [AddOn]? = nil, arn: String? = nil, blueprintId: String? = nil, blueprintName: String? = nil, bundleId: String? = nil, createdAt: Date? = nil, hardware: InstanceHardware? = nil, ipAddressType: IpAddressType? = nil, ipv6Addresses: [String]? = nil, isStaticIp: Bool? = nil, location: ResourceLocation? = nil, metadataOptions: InstanceMetadataOptions? = nil, name: String? = nil, networking: InstanceNetworking? = nil, privateIpAddress: String? = nil, publicIpAddress: String? = nil, resourceType: ResourceType? = nil, sshKeyName: String? = nil, state: InstanceState? = nil, supportCode: String? = nil, tags: [Tag]? = nil, username: String? = nil) {
            self.addOns = addOns
            self.arn = arn
            self.blueprintId = blueprintId
            self.blueprintName = blueprintName
            self.bundleId = bundleId
            self.createdAt = createdAt
            self.hardware = hardware
            self.ipAddressType = ipAddressType
            self.ipv6Addresses = ipv6Addresses
            self.isStaticIp = isStaticIp
            self.location = location
            self.metadataOptions = metadataOptions
            self.name = name
            self.networking = networking
            self.privateIpAddress = privateIpAddress
            self.publicIpAddress = publicIpAddress
            self.resourceType = resourceType
            self.sshKeyName = sshKeyName
            self.state = state
            self.supportCode = supportCode
            self.tags = tags
            self.username = username
        }

        private enum CodingKeys: String, CodingKey {
            case addOns = "addOns"
            case arn = "arn"
            case blueprintId = "blueprintId"
            case blueprintName = "blueprintName"
            case bundleId = "bundleId"
            case createdAt = "createdAt"
            case hardware = "hardware"
            case ipAddressType = "ipAddressType"
            case ipv6Addresses = "ipv6Addresses"
            case isStaticIp = "isStaticIp"
            case location = "location"
            case metadataOptions = "metadataOptions"
            case name = "name"
            case networking = "networking"
            case privateIpAddress = "privateIpAddress"
            case publicIpAddress = "publicIpAddress"
            case resourceType = "resourceType"
            case sshKeyName = "sshKeyName"
            case state = "state"
            case supportCode = "supportCode"
            case tags = "tags"
            case username = "username"
        }
    }

    public struct InstanceAccessDetails: AWSDecodableShape {
        /// For SSH access, the public key to use when accessing your instance For OpenSSH clients (command line SSH), you should save this value to tempkey-cert.pub.
        public let certKey: String?
        /// For SSH access, the date on which the temporary keys expire.
        public let expiresAt: Date?
        /// Describes the public SSH host keys or the RDP certificate.
        public let hostKeys: [HostKeyAttributes]?
        /// The name of this Amazon Lightsail instance.
        public let instanceName: String?
        /// The public IP address of the Amazon Lightsail instance.
        public let ipAddress: String?
        /// The IPv6 address of the Amazon Lightsail instance.
        public let ipv6Addresses: [String]?
        /// For RDP access, the password for your Amazon Lightsail instance. Password will be an empty string if the password for your new instance is not ready yet. When you create an instance, it can take up to 15 minutes for the instance to be ready.  If you create an instance using any key pair other than the default (LightsailDefaultKeyPair), password will always be an empty string. If you change the Administrator password on the instance, Lightsail will continue to return the original password value. When accessing the instance using RDP, you need to manually enter the Administrator password after changing it from the default.
        public let password: String?
        /// For a Windows Server-based instance, an object with the data you can use to retrieve your password. This is only needed if password is empty and the instance is not new (and therefore the password is not ready yet). When you create an instance, it can take up to 15 minutes for the instance to be ready.
        public let passwordData: PasswordData?
        /// For SSH access, the temporary private key. For OpenSSH clients (command line SSH), you should save this value to tempkey).
        public let privateKey: String?
        /// The protocol for these Amazon Lightsail instance access details.
        public let `protocol`: InstanceAccessProtocol?
        /// The user name to use when logging in to the Amazon Lightsail instance.
        public let username: String?

        @inlinable
        public init(certKey: String? = nil, expiresAt: Date? = nil, hostKeys: [HostKeyAttributes]? = nil, instanceName: String? = nil, ipAddress: String? = nil, ipv6Addresses: [String]? = nil, password: String? = nil, passwordData: PasswordData? = nil, privateKey: String? = nil, protocol: InstanceAccessProtocol? = nil, username: String? = nil) {
            self.certKey = certKey
            self.expiresAt = expiresAt
            self.hostKeys = hostKeys
            self.instanceName = instanceName
            self.ipAddress = ipAddress
            self.ipv6Addresses = ipv6Addresses
            self.password = password
            self.passwordData = passwordData
            self.privateKey = privateKey
            self.`protocol` = `protocol`
            self.username = username
        }

        private enum CodingKeys: String, CodingKey {
            case certKey = "certKey"
            case expiresAt = "expiresAt"
            case hostKeys = "hostKeys"
            case instanceName = "instanceName"
            case ipAddress = "ipAddress"
            case ipv6Addresses = "ipv6Addresses"
            case password = "password"
            case passwordData = "passwordData"
            case privateKey = "privateKey"
            case `protocol` = "protocol"
            case username = "username"
        }
    }

    public struct InstanceEntry: AWSEncodableShape {
        /// The Availability Zone for the new Amazon EC2 instance.
        public let availabilityZone: String
        /// The instance type (t2.micro) to use for the new Amazon EC2 instance.
        public let instanceType: String
        /// The port configuration to use for the new Amazon EC2 instance. The following configuration options are available:    DEFAULT - Use the default firewall settings from the Lightsail instance blueprint. If this is specified, then IPv4 and IPv6 will be configured for the new instance that is created in Amazon EC2.    INSTANCE - Use the configured firewall settings from the source Lightsail instance. If this is specified, the new instance that is created in Amazon EC2 will be configured to match the configuration of the source Lightsail instance. For example, if the source instance is configured for dual-stack (IPv4 and IPv6), then IPv4 and IPv6 will be configured for the new instance that is created in Amazon EC2. If the source instance is configured for IPv4 only, then only IPv4 will be configured for the new instance that is created in Amazon EC2.    NONE - Use the default Amazon EC2 security group. If this is specified, then only IPv4 will be configured for the new instance that is created in Amazon EC2.    CLOSED - All ports closed. If this is specified, then only IPv4 will be configured for the new instance that is created in Amazon EC2.    If you configured lightsail-connect as a cidrListAliases on your instance, or if you chose to allow the Lightsail browser-based SSH or RDP clients to connect to your instance, that configuration is not carried over to your new Amazon EC2 instance.
        public let portInfoSource: PortInfoSourceType
        /// The name of the export snapshot record, which contains the exported Lightsail instance snapshot that will be used as the source of the new Amazon EC2 instance. Use the get export snapshot records operation to get a list of export snapshot records that you can use to create a CloudFormation stack.
        public let sourceName: String
        /// A launch script you can create that configures a server with additional user data. For example, you might want to run apt-get -y update.  Depending on the machine image you choose, the command to get software on your instance varies. Amazon Linux and CentOS use yum, Debian and Ubuntu use apt-get, and FreeBSD uses pkg.
        public let userData: String?

        @inlinable
        public init(availabilityZone: String, instanceType: String, portInfoSource: PortInfoSourceType, sourceName: String, userData: String? = nil) {
            self.availabilityZone = availabilityZone
            self.instanceType = instanceType
            self.portInfoSource = portInfoSource
            self.sourceName = sourceName
            self.userData = userData
        }

        public func validate(name: String) throws {
            try self.validate(self.instanceType, name: "instanceType", parent: name, pattern: "\\S")
            try self.validate(self.sourceName, name: "sourceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case availabilityZone = "availabilityZone"
            case instanceType = "instanceType"
            case portInfoSource = "portInfoSource"
            case sourceName = "sourceName"
            case userData = "userData"
        }
    }

    public struct InstanceHardware: AWSDecodableShape {
        /// The number of vCPUs the instance has.
        public let cpuCount: Int?
        /// The disks attached to the instance.
        public let disks: [Disk]?
        /// The amount of RAM in GB on the instance (1.0).
        public let ramSizeInGb: Float?

        @inlinable
        public init(cpuCount: Int? = nil, disks: [Disk]? = nil, ramSizeInGb: Float? = nil) {
            self.cpuCount = cpuCount
            self.disks = disks
            self.ramSizeInGb = ramSizeInGb
        }

        private enum CodingKeys: String, CodingKey {
            case cpuCount = "cpuCount"
            case disks = "disks"
            case ramSizeInGb = "ramSizeInGb"
        }
    }

    public struct InstanceHealthSummary: AWSDecodableShape {
        /// Describes the overall instance health. Valid values are below.
        public let instanceHealth: InstanceHealthState?
        /// More information about the instance health. If the instanceHealth is healthy, then an instanceHealthReason value is not provided. If  instanceHealth is initial, the  instanceHealthReason value can be one of the following:     Lb.RegistrationInProgress - The target instance is in the process of being registered with the load balancer.     Lb.InitialHealthChecking - The Lightsail load balancer is still sending the target instance the minimum number of health checks required to determine its health status.   If  instanceHealth is unhealthy, the  instanceHealthReason value can be one of the following:     Instance.ResponseCodeMismatch - The health checks did not return an expected HTTP code.     Instance.Timeout - The health check requests timed out.     Instance.FailedHealthChecks - The health checks failed because the connection to the target instance timed out, the target instance response was malformed, or the target instance failed the health check for an unknown reason.     Lb.InternalError - The health checks failed due to an internal error.   If  instanceHealth is unused, the  instanceHealthReason value can be one of the following:     Instance.NotRegistered - The target instance is not registered with the target group.     Instance.NotInUse - The target group is not used by any load balancer, or the target instance is in an Availability Zone that is not enabled for its load balancer.     Instance.IpUnusable - The target IP address is reserved for use by a Lightsail load balancer.     Instance.InvalidState - The target is in the stopped or terminated state.   If  instanceHealth is draining, the  instanceHealthReason value can be one of the following:     Instance.DeregistrationInProgress - The target instance is in the process of being deregistered and the deregistration delay period has not expired.
        public let instanceHealthReason: InstanceHealthReason?
        /// The name of the Lightsail instance for which you are requesting health check data.
        public let instanceName: String?

        @inlinable
        public init(instanceHealth: InstanceHealthState? = nil, instanceHealthReason: InstanceHealthReason? = nil, instanceName: String? = nil) {
            self.instanceHealth = instanceHealth
            self.instanceHealthReason = instanceHealthReason
            self.instanceName = instanceName
        }

        private enum CodingKeys: String, CodingKey {
            case instanceHealth = "instanceHealth"
            case instanceHealthReason = "instanceHealthReason"
            case instanceName = "instanceName"
        }
    }

    public struct InstanceMetadataOptions: AWSDecodableShape {
        /// Indicates whether the HTTP metadata endpoint on your instances is enabled or disabled. If the value is disabled, you cannot access your instance metadata.
        public let httpEndpoint: HttpEndpoint?
        /// Indicates whether the IPv6 endpoint for the instance metadata service is enabled or disabled.
        public let httpProtocolIpv6: HttpProtocolIpv6?
        /// The desired HTTP PUT response hop limit for instance metadata requests. A larger number means that the instance metadata requests can travel farther.
        public let httpPutResponseHopLimit: Int?
        /// The state of token usage for your instance metadata requests. If the state is optional, you can choose whether to retrieve instance metadata with a signed token header on your request. If you retrieve the IAM role credentials without a token, the version 1.0 role credentials are returned. If you retrieve the IAM role credentials by using a valid signed token, the version 2.0 role credentials are returned. If the state is required, you must send a signed token header with all instance metadata retrieval requests. In this state, retrieving the IAM role credential always returns the version 2.0 credentials. The version 1.0 credentials are not available.  Not all instance blueprints in Lightsail support version 2.0 credentials. Use the MetadataNoToken instance metric to track the number of calls to the instance metadata service that are using version 1.0 credentials. For more information, see Viewing instance metrics in Amazon Lightsail in the Amazon Lightsail Developer Guide.
        public let httpTokens: HttpTokens?
        /// The state of the metadata option changes. The following states are possible:    pending - The metadata options are being updated. The instance is not yet ready to process metadata traffic with the new selection.    applied - The metadata options have been successfully applied to the instance.
        public let state: InstanceMetadataState?

        @inlinable
        public init(httpEndpoint: HttpEndpoint? = nil, httpProtocolIpv6: HttpProtocolIpv6? = nil, httpPutResponseHopLimit: Int? = nil, httpTokens: HttpTokens? = nil, state: InstanceMetadataState? = nil) {
            self.httpEndpoint = httpEndpoint
            self.httpProtocolIpv6 = httpProtocolIpv6
            self.httpPutResponseHopLimit = httpPutResponseHopLimit
            self.httpTokens = httpTokens
            self.state = state
        }

        private enum CodingKeys: String, CodingKey {
            case httpEndpoint = "httpEndpoint"
            case httpProtocolIpv6 = "httpProtocolIpv6"
            case httpPutResponseHopLimit = "httpPutResponseHopLimit"
            case httpTokens = "httpTokens"
            case state = "state"
        }
    }

    public struct InstanceNetworking: AWSDecodableShape {
        /// The amount of data in GB allocated for monthly data transfers.
        public let monthlyTransfer: MonthlyTransfer?
        /// An array of key-value pairs containing information about the ports on the instance.
        public let ports: [InstancePortInfo]?

        @inlinable
        public init(monthlyTransfer: MonthlyTransfer? = nil, ports: [InstancePortInfo]? = nil) {
            self.monthlyTransfer = monthlyTransfer
            self.ports = ports
        }

        private enum CodingKeys: String, CodingKey {
            case monthlyTransfer = "monthlyTransfer"
            case ports = "ports"
        }
    }

    public struct InstancePortInfo: AWSDecodableShape {
        /// The access direction (inbound or outbound).  Lightsail currently supports only inbound access direction.
        public let accessDirection: AccessDirection?
        /// The location from which access is allowed. For example, Anywhere (0.0.0.0/0), or Custom if a specific IP address or range of IP addresses is allowed.
        public let accessFrom: String?
        /// The type of access (Public or Private).
        public let accessType: PortAccessType?
        /// An alias that defines access for a preconfigured range of IP addresses. The only alias currently supported is lightsail-connect, which allows IP addresses of the browser-based RDP/SSH client in the Lightsail console to connect to your instance.
        public let cidrListAliases: [String]?
        /// The IPv4 address, or range of IPv4 addresses (in CIDR notation) that are allowed to connect to an instance through the ports, and the protocol.  The ipv6Cidrs parameter lists the IPv6 addresses that are allowed to connect to an instance.  For more information about CIDR block notation, see Classless Inter-Domain Routing on Wikipedia.
        public let cidrs: [String]?
        /// The common name of the port information.
        public let commonName: String?
        /// The first port in a range of open ports on an instance. Allowed ports:   TCP and UDP - 0 to 65535    ICMP - The ICMP type for IPv4 addresses. For example, specify 8 as the fromPort (ICMP type), and -1 as the toPort (ICMP code), to enable ICMP Ping. For more information, see Control Messages on Wikipedia.   ICMPv6 - The ICMP type for IPv6 addresses. For example, specify 128 as the fromPort (ICMPv6 type), and 0 as toPort (ICMPv6 code). For more information, see Internet Control Message Protocol for IPv6.
        public let fromPort: Int?
        /// The IPv6 address, or range of IPv6 addresses (in CIDR notation) that are allowed to connect to an instance through the ports, and the protocol. Only devices with an IPv6 address can connect to an instance through IPv6; otherwise, IPv4 should be used.  The cidrs parameter lists the IPv4 addresses that are allowed to connect to an instance.  For more information about CIDR block notation, see Classless Inter-Domain Routing on Wikipedia.
        public let ipv6Cidrs: [String]?
        /// The IP protocol name. The name can be one of the following:    tcp - Transmission Control Protocol (TCP) provides reliable, ordered, and error-checked delivery of streamed data between applications running on hosts communicating by an IP network. If you have an application that doesn't require reliable data stream service, use UDP instead.    all - All transport layer protocol types. For more general information, see Transport layer on Wikipedia.    udp - With User Datagram Protocol (UDP), computer applications can send messages (or datagrams) to other hosts on an Internet Protocol (IP) network. Prior communications are not required to set up transmission channels or data paths. Applications that don't require reliable data stream service can use UDP, which provides a connectionless datagram service that emphasizes reduced latency over reliability. If you do require reliable data stream service, use TCP instead.    icmp - Internet Control Message Protocol (ICMP) is used to send error messages and operational information indicating success or failure when communicating with an instance. For example, an error is indicated when an instance could not be reached. When you specify icmp as the protocol, you must specify the ICMP type using the fromPort parameter, and ICMP code using the toPort parameter.    icmp6 - Internet Control Message Protocol (ICMP) for IPv6. When you specify icmp6 as the protocol, you must specify the ICMP type using the fromPort parameter, and ICMP code using the toPort parameter.
        public let `protocol`: NetworkProtocol?
        /// The last port in a range of open ports on an instance. Allowed ports:   TCP and UDP - 0 to 65535    ICMP - The ICMP code for IPv4 addresses. For example, specify 8 as the fromPort (ICMP type), and -1 as the toPort (ICMP code), to enable ICMP Ping. For more information, see Control Messages on Wikipedia.   ICMPv6 - The ICMP code for IPv6 addresses. For example, specify 128 as the fromPort (ICMPv6 type), and 0 as toPort (ICMPv6 code). For more information, see Internet Control Message Protocol for IPv6.
        public let toPort: Int?

        @inlinable
        public init(accessDirection: AccessDirection? = nil, accessFrom: String? = nil, accessType: PortAccessType? = nil, cidrListAliases: [String]? = nil, cidrs: [String]? = nil, commonName: String? = nil, fromPort: Int? = nil, ipv6Cidrs: [String]? = nil, protocol: NetworkProtocol? = nil, toPort: Int? = nil) {
            self.accessDirection = accessDirection
            self.accessFrom = accessFrom
            self.accessType = accessType
            self.cidrListAliases = cidrListAliases
            self.cidrs = cidrs
            self.commonName = commonName
            self.fromPort = fromPort
            self.ipv6Cidrs = ipv6Cidrs
            self.`protocol` = `protocol`
            self.toPort = toPort
        }

        private enum CodingKeys: String, CodingKey {
            case accessDirection = "accessDirection"
            case accessFrom = "accessFrom"
            case accessType = "accessType"
            case cidrListAliases = "cidrListAliases"
            case cidrs = "cidrs"
            case commonName = "commonName"
            case fromPort = "fromPort"
            case ipv6Cidrs = "ipv6Cidrs"
            case `protocol` = "protocol"
            case toPort = "toPort"
        }
    }

    public struct InstancePortState: AWSDecodableShape {
        /// An alias that defines access for a preconfigured range of IP addresses. The only alias currently supported is lightsail-connect, which allows IP addresses of the browser-based RDP/SSH client in the Lightsail console to connect to your instance.
        public let cidrListAliases: [String]?
        /// The IPv4 address, or range of IPv4 addresses (in CIDR notation) that are allowed to connect to an instance through the ports, and the protocol.  The ipv6Cidrs parameter lists the IPv6 addresses that are allowed to connect to an instance.  For more information about CIDR block notation, see Classless Inter-Domain Routing on Wikipedia.
        public let cidrs: [String]?
        /// The first port in a range of open ports on an instance. Allowed ports:   TCP and UDP - 0 to 65535    ICMP - The ICMP type for IPv4 addresses. For example, specify 8 as the fromPort (ICMP type), and -1 as the toPort (ICMP code), to enable ICMP Ping. For more information, see Control Messages on Wikipedia.   ICMPv6 - The ICMP type for IPv6 addresses. For example, specify 128 as the fromPort (ICMPv6 type), and 0 as toPort (ICMPv6 code). For more information, see Internet Control Message Protocol for IPv6.
        public let fromPort: Int?
        /// The IPv6 address, or range of IPv6 addresses (in CIDR notation) that are allowed to connect to an instance through the ports, and the protocol. Only devices with an IPv6 address can connect to an instance through IPv6; otherwise, IPv4 should be used.  The cidrs parameter lists the IPv4 addresses that are allowed to connect to an instance.  For more information about CIDR block notation, see Classless Inter-Domain Routing on Wikipedia.
        public let ipv6Cidrs: [String]?
        /// The IP protocol name. The name can be one of the following:    tcp - Transmission Control Protocol (TCP) provides reliable, ordered, and error-checked delivery of streamed data between applications running on hosts communicating by an IP network. If you have an application that doesn't require reliable data stream service, use UDP instead.    all - All transport layer protocol types. For more general information, see Transport layer on Wikipedia.    udp - With User Datagram Protocol (UDP), computer applications can send messages (or datagrams) to other hosts on an Internet Protocol (IP) network. Prior communications are not required to set up transmission channels or data paths. Applications that don't require reliable data stream service can use UDP, which provides a connectionless datagram service that emphasizes reduced latency over reliability. If you do require reliable data stream service, use TCP instead.    icmp - Internet Control Message Protocol (ICMP) is used to send error messages and operational information indicating success or failure when communicating with an instance. For example, an error is indicated when an instance could not be reached. When you specify icmp as the protocol, you must specify the ICMP type using the fromPort parameter, and ICMP code using the toPort parameter.    icmp6 - Internet Control Message Protocol (ICMP) for IPv6. When you specify icmp6 as the protocol, you must specify the ICMP type using the fromPort parameter, and ICMP code using the toPort parameter.
        public let `protocol`: NetworkProtocol?
        /// Specifies whether the instance port is open or closed.  The port state for Lightsail instances is always open.
        public let state: PortState?
        /// The last port in a range of open ports on an instance. Allowed ports:   TCP and UDP - 0 to 65535    ICMP - The ICMP code for IPv4 addresses. For example, specify 8 as the fromPort (ICMP type), and -1 as the toPort (ICMP code), to enable ICMP Ping. For more information, see Control Messages on Wikipedia.   ICMPv6 - The ICMP code for IPv6 addresses. For example, specify 128 as the fromPort (ICMPv6 type), and 0 as toPort (ICMPv6 code). For more information, see Internet Control Message Protocol for IPv6.
        public let toPort: Int?

        @inlinable
        public init(cidrListAliases: [String]? = nil, cidrs: [String]? = nil, fromPort: Int? = nil, ipv6Cidrs: [String]? = nil, protocol: NetworkProtocol? = nil, state: PortState? = nil, toPort: Int? = nil) {
            self.cidrListAliases = cidrListAliases
            self.cidrs = cidrs
            self.fromPort = fromPort
            self.ipv6Cidrs = ipv6Cidrs
            self.`protocol` = `protocol`
            self.state = state
            self.toPort = toPort
        }

        private enum CodingKeys: String, CodingKey {
            case cidrListAliases = "cidrListAliases"
            case cidrs = "cidrs"
            case fromPort = "fromPort"
            case ipv6Cidrs = "ipv6Cidrs"
            case `protocol` = "protocol"
            case state = "state"
            case toPort = "toPort"
        }
    }

    public struct InstanceSnapshot: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the snapshot (arn:aws:lightsail:us-east-2:123456789101:InstanceSnapshot/d23b5706-3322-4d83-81e5-12345EXAMPLE).
        public let arn: String?
        /// The timestamp when the snapshot was created (1479907467.024).
        public let createdAt: Date?
        /// An array of disk objects containing information about all block storage disks.
        public let fromAttachedDisks: [Disk]?
        /// The blueprint ID from which you created the snapshot (amazon_linux_2023). A blueprint is a virtual private server (or instance) image used to create instances quickly.
        public let fromBlueprintId: String?
        /// The bundle ID from which you created the snapshot (micro_x_x).
        public let fromBundleId: String?
        /// The Amazon Resource Name (ARN) of the instance from which the snapshot was created (arn:aws:lightsail:us-east-2:123456789101:Instance/64b8404c-ccb1-430b-8daf-12345EXAMPLE).
        public let fromInstanceArn: String?
        /// The instance from which the snapshot was created.
        public let fromInstanceName: String?
        /// A Boolean value indicating whether the snapshot was created from an automatic snapshot.
        public let isFromAutoSnapshot: Bool?
        /// The region name and Availability Zone where you created the snapshot.
        public let location: ResourceLocation?
        /// The name of the snapshot.
        public let name: String?
        /// The progress of the snapshot.  This is populated only for disk snapshots, and is null for instance snapshots.
        public let progress: String?
        /// The type of resource (usually InstanceSnapshot).
        public let resourceType: ResourceType?
        /// The size in GB of the SSD.
        public let sizeInGb: Int?
        /// The state the snapshot is in.
        public let state: InstanceSnapshotState?
        /// The support code. Include this code in your email to support when you have questions about an instance or another resource in Lightsail. This code enables our support team to look up your Lightsail information more easily.
        public let supportCode: String?
        /// The tag keys and optional values for the resource. For more information about tags in Lightsail, see the Amazon Lightsail Developer Guide.
        public let tags: [Tag]?

        @inlinable
        public init(arn: String? = nil, createdAt: Date? = nil, fromAttachedDisks: [Disk]? = nil, fromBlueprintId: String? = nil, fromBundleId: String? = nil, fromInstanceArn: String? = nil, fromInstanceName: String? = nil, isFromAutoSnapshot: Bool? = nil, location: ResourceLocation? = nil, name: String? = nil, progress: String? = nil, resourceType: ResourceType? = nil, sizeInGb: Int? = nil, state: InstanceSnapshotState? = nil, supportCode: String? = nil, tags: [Tag]? = nil) {
            self.arn = arn
            self.createdAt = createdAt
            self.fromAttachedDisks = fromAttachedDisks
            self.fromBlueprintId = fromBlueprintId
            self.fromBundleId = fromBundleId
            self.fromInstanceArn = fromInstanceArn
            self.fromInstanceName = fromInstanceName
            self.isFromAutoSnapshot = isFromAutoSnapshot
            self.location = location
            self.name = name
            self.progress = progress
            self.resourceType = resourceType
            self.sizeInGb = sizeInGb
            self.state = state
            self.supportCode = supportCode
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "arn"
            case createdAt = "createdAt"
            case fromAttachedDisks = "fromAttachedDisks"
            case fromBlueprintId = "fromBlueprintId"
            case fromBundleId = "fromBundleId"
            case fromInstanceArn = "fromInstanceArn"
            case fromInstanceName = "fromInstanceName"
            case isFromAutoSnapshot = "isFromAutoSnapshot"
            case location = "location"
            case name = "name"
            case progress = "progress"
            case resourceType = "resourceType"
            case sizeInGb = "sizeInGb"
            case state = "state"
            case supportCode = "supportCode"
            case tags = "tags"
        }
    }

    public struct InstanceSnapshotInfo: AWSDecodableShape {
        /// The blueprint ID from which the source instance (amazon_linux_2023).
        public let fromBlueprintId: String?
        /// The bundle ID from which the source instance was created (micro_x_x).
        public let fromBundleId: String?
        /// A list of objects describing the disks that were attached to the source instance.
        public let fromDiskInfo: [DiskInfo]?

        @inlinable
        public init(fromBlueprintId: String? = nil, fromBundleId: String? = nil, fromDiskInfo: [DiskInfo]? = nil) {
            self.fromBlueprintId = fromBlueprintId
            self.fromBundleId = fromBundleId
            self.fromDiskInfo = fromDiskInfo
        }

        private enum CodingKeys: String, CodingKey {
            case fromBlueprintId = "fromBlueprintId"
            case fromBundleId = "fromBundleId"
            case fromDiskInfo = "fromDiskInfo"
        }
    }

    public struct InstanceState: AWSDecodableShape {
        /// The status code for the instance.
        public let code: Int?
        /// The state of the instance (running or pending).
        public let name: String?

        @inlinable
        public init(code: Int? = nil, name: String? = nil) {
            self.code = code
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case code = "code"
            case name = "name"
        }
    }

    public struct InvalidInputException: AWSErrorShape {
        public let code: String?
        public let docs: String?
        public let message: String?
        public let tip: String?

        @inlinable
        public init(code: String? = nil, docs: String? = nil, message: String? = nil, tip: String? = nil) {
            self.code = code
            self.docs = docs
            self.message = message
            self.tip = tip
        }

        private enum CodingKeys: String, CodingKey {
            case code = "code"
            case docs = "docs"
            case message = "message"
            case tip = "tip"
        }
    }

    public struct IsVpcPeeredRequest: AWSEncodableShape {
        public init() {}
    }

    public struct IsVpcPeeredResult: AWSDecodableShape {
        /// Returns true if the Lightsail VPC is peered; otherwise, false.
        public let isPeered: Bool?

        @inlinable
        public init(isPeered: Bool? = nil) {
            self.isPeered = isPeered
        }

        private enum CodingKeys: String, CodingKey {
            case isPeered = "isPeered"
        }
    }

    public struct KeyPair: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the key pair (arn:aws:lightsail:us-east-2:123456789101:KeyPair/05859e3d-331d-48ba-9034-12345EXAMPLE).
        public let arn: String?
        /// The timestamp when the key pair was created (1479816991.349).
        public let createdAt: Date?
        /// The RSA fingerprint of the key pair.
        public let fingerprint: String?
        /// The region name and Availability Zone where the key pair was created.
        public let location: ResourceLocation?
        /// The friendly name of the SSH key pair.
        public let name: String?
        /// The resource type (usually KeyPair).
        public let resourceType: ResourceType?
        /// The support code. Include this code in your email to support when you have questions about an instance or another resource in Lightsail. This code enables our support team to look up your Lightsail information more easily.
        public let supportCode: String?
        /// The tag keys and optional values for the resource. For more information about tags in Lightsail, see the Amazon Lightsail Developer Guide.
        public let tags: [Tag]?

        @inlinable
        public init(arn: String? = nil, createdAt: Date? = nil, fingerprint: String? = nil, location: ResourceLocation? = nil, name: String? = nil, resourceType: ResourceType? = nil, supportCode: String? = nil, tags: [Tag]? = nil) {
            self.arn = arn
            self.createdAt = createdAt
            self.fingerprint = fingerprint
            self.location = location
            self.name = name
            self.resourceType = resourceType
            self.supportCode = supportCode
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "arn"
            case createdAt = "createdAt"
            case fingerprint = "fingerprint"
            case location = "location"
            case name = "name"
            case resourceType = "resourceType"
            case supportCode = "supportCode"
            case tags = "tags"
        }
    }

    public struct LightsailDistribution: AWSDecodableShape {
        /// Indicates whether the bundle that is currently applied to your distribution, specified using the distributionName parameter, can be changed to another bundle. Use the UpdateDistributionBundle action to change your distribution's bundle.
        public let ableToUpdateBundle: Bool?
        /// The alternate domain names of the distribution.
        public let alternativeDomainNames: [String]?
        /// The Amazon Resource Name (ARN) of the distribution.
        public let arn: String?
        /// The ID of the bundle currently applied to the distribution.
        public let bundleId: String?
        /// An array of objects that describe the per-path cache behavior of the distribution.
        public let cacheBehaviors: [CacheBehaviorPerPath]?
        /// An object that describes the cache behavior settings of the distribution.
        public let cacheBehaviorSettings: CacheSettings?
        /// The name of the SSL/TLS certificate attached to the distribution, if any.
        public let certificateName: String?
        /// The timestamp when the distribution was created.
        public let createdAt: Date?
        /// An object that describes the default cache behavior of the distribution.
        public let defaultCacheBehavior: CacheBehavior?
        /// The domain name of the distribution.
        public let domainName: String?
        /// The IP address type of the distribution. The possible values are ipv4 for IPv4 only, and dualstack for IPv4 and IPv6.
        public let ipAddressType: IpAddressType?
        /// Indicates whether the distribution is enabled.
        public let isEnabled: Bool?
        /// An object that describes the location of the distribution, such as the Amazon Web Services Region and Availability Zone.  Lightsail distributions are global resources that can reference an origin in any Amazon Web Services Region, and distribute its content globally. However, all distributions are located in the us-east-1 Region.
        public let location: ResourceLocation?
        /// The name of the distribution.
        public let name: String?
        /// An object that describes the origin resource of the distribution, such as a Lightsail instance, bucket, or load balancer. The distribution pulls, caches, and serves content from the origin.
        public let origin: Origin?
        /// The public DNS of the origin.
        public let originPublicDNS: String?
        /// The Lightsail resource type (Distribution).
        public let resourceType: ResourceType?
        /// The status of the distribution.
        public let status: String?
        /// The support code. Include this code in your email to support when you have questions about your Lightsail distribution. This code enables our support team to look up your Lightsail information more easily.
        public let supportCode: String?
        /// The tag keys and optional values for the resource. For more information about tags in Lightsail, see the Amazon Lightsail Developer Guide.
        public let tags: [Tag]?
        /// The minimum TLS protocol version that the distribution can use to communicate with viewers.
        public let viewerMinimumTlsProtocolVersion: String?

        @inlinable
        public init(ableToUpdateBundle: Bool? = nil, alternativeDomainNames: [String]? = nil, arn: String? = nil, bundleId: String? = nil, cacheBehaviors: [CacheBehaviorPerPath]? = nil, cacheBehaviorSettings: CacheSettings? = nil, certificateName: String? = nil, createdAt: Date? = nil, defaultCacheBehavior: CacheBehavior? = nil, domainName: String? = nil, ipAddressType: IpAddressType? = nil, isEnabled: Bool? = nil, location: ResourceLocation? = nil, name: String? = nil, origin: Origin? = nil, originPublicDNS: String? = nil, resourceType: ResourceType? = nil, status: String? = nil, supportCode: String? = nil, tags: [Tag]? = nil, viewerMinimumTlsProtocolVersion: String? = nil) {
            self.ableToUpdateBundle = ableToUpdateBundle
            self.alternativeDomainNames = alternativeDomainNames
            self.arn = arn
            self.bundleId = bundleId
            self.cacheBehaviors = cacheBehaviors
            self.cacheBehaviorSettings = cacheBehaviorSettings
            self.certificateName = certificateName
            self.createdAt = createdAt
            self.defaultCacheBehavior = defaultCacheBehavior
            self.domainName = domainName
            self.ipAddressType = ipAddressType
            self.isEnabled = isEnabled
            self.location = location
            self.name = name
            self.origin = origin
            self.originPublicDNS = originPublicDNS
            self.resourceType = resourceType
            self.status = status
            self.supportCode = supportCode
            self.tags = tags
            self.viewerMinimumTlsProtocolVersion = viewerMinimumTlsProtocolVersion
        }

        private enum CodingKeys: String, CodingKey {
            case ableToUpdateBundle = "ableToUpdateBundle"
            case alternativeDomainNames = "alternativeDomainNames"
            case arn = "arn"
            case bundleId = "bundleId"
            case cacheBehaviors = "cacheBehaviors"
            case cacheBehaviorSettings = "cacheBehaviorSettings"
            case certificateName = "certificateName"
            case createdAt = "createdAt"
            case defaultCacheBehavior = "defaultCacheBehavior"
            case domainName = "domainName"
            case ipAddressType = "ipAddressType"
            case isEnabled = "isEnabled"
            case location = "location"
            case name = "name"
            case origin = "origin"
            case originPublicDNS = "originPublicDNS"
            case resourceType = "resourceType"
            case status = "status"
            case supportCode = "supportCode"
            case tags = "tags"
            case viewerMinimumTlsProtocolVersion = "viewerMinimumTlsProtocolVersion"
        }
    }

    public struct LoadBalancer: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the load balancer.
        public let arn: String?
        /// A string to string map of the configuration options for your load balancer. Valid values are listed below.
        public let configurationOptions: [LoadBalancerAttributeName: String]?
        /// The date when your load balancer was created.
        public let createdAt: Date?
        /// The DNS name of your Lightsail load balancer.
        public let dnsName: String?
        /// The path you specified to perform your health checks. If no path is specified, the load balancer tries to make a request to the default (root) page.
        public let healthCheckPath: String?
        /// A Boolean value that indicates whether HTTPS redirection is enabled for the load balancer.
        public let httpsRedirectionEnabled: Bool?
        /// An array of InstanceHealthSummary objects describing the health of the load balancer.
        public let instanceHealthSummary: [InstanceHealthSummary]?
        /// The port where the load balancer will direct traffic to your Lightsail instances. For HTTP traffic, it's port 80. For HTTPS traffic, it's port 443.
        public let instancePort: Int?
        /// The IP address type of the load balancer. The possible values are ipv4 for IPv4 only, ipv6 for IPv6 only, and dualstack for IPv4 and IPv6.
        public let ipAddressType: IpAddressType?
        /// The AWS Region where your load balancer was created (us-east-2a). Lightsail automatically creates your load balancer across Availability Zones.
        public let location: ResourceLocation?
        /// The name of the load balancer (my-load-balancer).
        public let name: String?
        /// The protocol you have enabled for your load balancer. Valid values are below. You can't just have HTTP_HTTPS, but you can have just HTTP.
        public let `protocol`: LoadBalancerProtocol?
        /// An array of public port settings for your load balancer. For HTTP, use port 80. For HTTPS, use port 443.
        public let publicPorts: [Int]?
        /// The resource type (LoadBalancer.
        public let resourceType: ResourceType?
        /// The status of your load balancer. Valid values are below.
        public let state: LoadBalancerState?
        /// The support code. Include this code in your email to support when you have questions about your Lightsail load balancer. This code enables our support team to look up your Lightsail information more easily.
        public let supportCode: String?
        /// The tag keys and optional values for the resource. For more information about tags in Lightsail, see the Amazon Lightsail Developer Guide.
        public let tags: [Tag]?
        /// An array of LoadBalancerTlsCertificateSummary objects that provide additional information about the SSL/TLS certificates. For example, if true, the certificate is attached to the load balancer.
        public let tlsCertificateSummaries: [LoadBalancerTlsCertificateSummary]?
        /// The name of the TLS security policy for the load balancer.
        public let tlsPolicyName: String?

        @inlinable
        public init(arn: String? = nil, configurationOptions: [LoadBalancerAttributeName: String]? = nil, createdAt: Date? = nil, dnsName: String? = nil, healthCheckPath: String? = nil, httpsRedirectionEnabled: Bool? = nil, instanceHealthSummary: [InstanceHealthSummary]? = nil, instancePort: Int? = nil, ipAddressType: IpAddressType? = nil, location: ResourceLocation? = nil, name: String? = nil, protocol: LoadBalancerProtocol? = nil, publicPorts: [Int]? = nil, resourceType: ResourceType? = nil, state: LoadBalancerState? = nil, supportCode: String? = nil, tags: [Tag]? = nil, tlsCertificateSummaries: [LoadBalancerTlsCertificateSummary]? = nil, tlsPolicyName: String? = nil) {
            self.arn = arn
            self.configurationOptions = configurationOptions
            self.createdAt = createdAt
            self.dnsName = dnsName
            self.healthCheckPath = healthCheckPath
            self.httpsRedirectionEnabled = httpsRedirectionEnabled
            self.instanceHealthSummary = instanceHealthSummary
            self.instancePort = instancePort
            self.ipAddressType = ipAddressType
            self.location = location
            self.name = name
            self.`protocol` = `protocol`
            self.publicPorts = publicPorts
            self.resourceType = resourceType
            self.state = state
            self.supportCode = supportCode
            self.tags = tags
            self.tlsCertificateSummaries = tlsCertificateSummaries
            self.tlsPolicyName = tlsPolicyName
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "arn"
            case configurationOptions = "configurationOptions"
            case createdAt = "createdAt"
            case dnsName = "dnsName"
            case healthCheckPath = "healthCheckPath"
            case httpsRedirectionEnabled = "httpsRedirectionEnabled"
            case instanceHealthSummary = "instanceHealthSummary"
            case instancePort = "instancePort"
            case ipAddressType = "ipAddressType"
            case location = "location"
            case name = "name"
            case `protocol` = "protocol"
            case publicPorts = "publicPorts"
            case resourceType = "resourceType"
            case state = "state"
            case supportCode = "supportCode"
            case tags = "tags"
            case tlsCertificateSummaries = "tlsCertificateSummaries"
            case tlsPolicyName = "tlsPolicyName"
        }
    }

    public struct LoadBalancerTlsCertificate: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the SSL/TLS certificate.
        public let arn: String?
        /// The time when you created your SSL/TLS certificate.
        public let createdAt: Date?
        /// The domain name for your SSL/TLS certificate.
        public let domainName: String?
        /// An array of LoadBalancerTlsCertificateDomainValidationRecord objects describing the records.
        public let domainValidationRecords: [LoadBalancerTlsCertificateDomainValidationRecord]?
        /// The validation failure reason, if any, of the certificate. The following failure reasons are possible:     NO_AVAILABLE_CONTACTS - This failure applies to email validation, which is not available for Lightsail certificates.     ADDITIONAL_VERIFICATION_REQUIRED - Lightsail requires additional information to process this certificate request. This can happen as a fraud-protection measure, such as when the domain ranks within the Alexa top 1000 websites. To provide the required information, use the AWS Support Center to contact AWS Support.  You cannot request a certificate for Amazon-owned domain names such as those ending in amazonaws.com, cloudfront.net, or elasticbeanstalk.com.      DOMAIN_NOT_ALLOWED - One or more of the domain names in the certificate request was reported as an unsafe domain by VirusTotal. To correct the problem, search for your domain name on the VirusTotal website. If your domain is reported as suspicious, see Google Help for Hacked Websites to learn what you can do. If you believe that the result is a false positive, notify the organization that is reporting the domain. VirusTotal is an aggregate of several antivirus and URL scanners and cannot remove your domain from a block list itself. After you correct the problem and the VirusTotal registry has been updated, request a new certificate. If you see this error and your domain is not included in the VirusTotal list, visit the AWS Support Center and create a case.     INVALID_PUBLIC_DOMAIN - One or more of the domain names in the certificate request is not valid. Typically, this is because a domain name in the request is not a valid top-level domain. Try to request a certificate again, correcting any spelling errors or typos that were in the failed request, and ensure that all domain names in the request are for valid top-level domains. For example, you cannot request a certificate for example.invalidpublicdomain because invalidpublicdomain is not a valid top-level domain.     OTHER - Typically, this failure occurs when there is a typographical error in one or more of the domain names in the certificate request. Try to request a certificate again, correcting any spelling errors or typos that were in the failed request.
        public let failureReason: LoadBalancerTlsCertificateFailureReason?
        /// When true, the SSL/TLS certificate is attached to the Lightsail load balancer.
        public let isAttached: Bool?
        /// The time when the SSL/TLS certificate was issued.
        public let issuedAt: Date?
        /// The issuer of the certificate.
        public let issuer: String?
        /// The algorithm used to generate the key pair (the public and private key).
        public let keyAlgorithm: String?
        /// The load balancer name where your SSL/TLS certificate is attached.
        public let loadBalancerName: String?
        /// The Amazon Web Services Region and Availability Zone where you created your certificate.
        public let location: ResourceLocation?
        /// The name of the SSL/TLS certificate (my-certificate).
        public let name: String?
        /// The timestamp when the SSL/TLS certificate expires.
        public let notAfter: Date?
        /// The timestamp when the SSL/TLS certificate is first valid.
        public let notBefore: Date?
        /// An object that describes the status of the certificate renewal managed by Lightsail.
        public let renewalSummary: LoadBalancerTlsCertificateRenewalSummary?
        /// The resource type (LoadBalancerTlsCertificate).     Instance - A Lightsail instance (a virtual private server)     StaticIp - A static IP address     KeyPair - The key pair used to connect to a Lightsail instance     InstanceSnapshot - A Lightsail instance snapshot     Domain - A DNS zone     PeeredVpc - A peered VPC     LoadBalancer - A Lightsail load balancer     LoadBalancerTlsCertificate - An SSL/TLS certificate associated with a Lightsail load balancer     Disk - A Lightsail block storage disk     DiskSnapshot - A block storage disk snapshot
        public let resourceType: ResourceType?
        /// The reason the certificate was revoked. This value is present only when the certificate status is REVOKED.
        public let revocationReason: LoadBalancerTlsCertificateRevocationReason?
        /// The timestamp when the certificate was revoked. This value is present only when the certificate status is REVOKED.
        public let revokedAt: Date?
        /// The serial number of the certificate.
        public let serial: String?
        /// The algorithm that was used to sign the certificate.
        public let signatureAlgorithm: String?
        /// The validation status of the SSL/TLS certificate. Valid values are below.
        public let status: LoadBalancerTlsCertificateStatus?
        /// The name of the entity that is associated with the public key contained in the certificate.
        public let subject: String?
        /// An array of strings that specify the alternate domains (example2.com) and subdomains (blog.example.com) for the certificate.
        public let subjectAlternativeNames: [String]?
        /// The support code. Include this code in your email to support when you have questions about your Lightsail load balancer or SSL/TLS certificate. This code enables our support team to look up your Lightsail information more easily.
        public let supportCode: String?
        /// The tag keys and optional values for the resource. For more information about tags in Lightsail, see the Amazon Lightsail Developer Guide.
        public let tags: [Tag]?

        @inlinable
        public init(arn: String? = nil, createdAt: Date? = nil, domainName: String? = nil, domainValidationRecords: [LoadBalancerTlsCertificateDomainValidationRecord]? = nil, failureReason: LoadBalancerTlsCertificateFailureReason? = nil, isAttached: Bool? = nil, issuedAt: Date? = nil, issuer: String? = nil, keyAlgorithm: String? = nil, loadBalancerName: String? = nil, location: ResourceLocation? = nil, name: String? = nil, notAfter: Date? = nil, notBefore: Date? = nil, renewalSummary: LoadBalancerTlsCertificateRenewalSummary? = nil, resourceType: ResourceType? = nil, revocationReason: LoadBalancerTlsCertificateRevocationReason? = nil, revokedAt: Date? = nil, serial: String? = nil, signatureAlgorithm: String? = nil, status: LoadBalancerTlsCertificateStatus? = nil, subject: String? = nil, subjectAlternativeNames: [String]? = nil, supportCode: String? = nil, tags: [Tag]? = nil) {
            self.arn = arn
            self.createdAt = createdAt
            self.domainName = domainName
            self.domainValidationRecords = domainValidationRecords
            self.failureReason = failureReason
            self.isAttached = isAttached
            self.issuedAt = issuedAt
            self.issuer = issuer
            self.keyAlgorithm = keyAlgorithm
            self.loadBalancerName = loadBalancerName
            self.location = location
            self.name = name
            self.notAfter = notAfter
            self.notBefore = notBefore
            self.renewalSummary = renewalSummary
            self.resourceType = resourceType
            self.revocationReason = revocationReason
            self.revokedAt = revokedAt
            self.serial = serial
            self.signatureAlgorithm = signatureAlgorithm
            self.status = status
            self.subject = subject
            self.subjectAlternativeNames = subjectAlternativeNames
            self.supportCode = supportCode
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "arn"
            case createdAt = "createdAt"
            case domainName = "domainName"
            case domainValidationRecords = "domainValidationRecords"
            case failureReason = "failureReason"
            case isAttached = "isAttached"
            case issuedAt = "issuedAt"
            case issuer = "issuer"
            case keyAlgorithm = "keyAlgorithm"
            case loadBalancerName = "loadBalancerName"
            case location = "location"
            case name = "name"
            case notAfter = "notAfter"
            case notBefore = "notBefore"
            case renewalSummary = "renewalSummary"
            case resourceType = "resourceType"
            case revocationReason = "revocationReason"
            case revokedAt = "revokedAt"
            case serial = "serial"
            case signatureAlgorithm = "signatureAlgorithm"
            case status = "status"
            case subject = "subject"
            case subjectAlternativeNames = "subjectAlternativeNames"
            case supportCode = "supportCode"
            case tags = "tags"
        }
    }

    public struct LoadBalancerTlsCertificateDnsRecordCreationState: AWSDecodableShape {
        /// The status code for the automated DNS record creation. Following are the possible values:    SUCCEEDED - The validation records were successfully added.    STARTED - The automatic DNS record creation has started.    FAILED - The validation record addition failed.
        public let code: LoadBalancerTlsCertificateDnsRecordCreationStateCode?
        /// The message that describes the reason for the status code.
        public let message: String?

        @inlinable
        public init(code: LoadBalancerTlsCertificateDnsRecordCreationStateCode? = nil, message: String? = nil) {
            self.code = code
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "code"
            case message = "message"
        }
    }

    public struct LoadBalancerTlsCertificateDomainValidationOption: AWSDecodableShape {
        /// The fully qualified domain name in the certificate request.
        public let domainName: String?
        /// The status of the domain validation. Valid values are listed below.
        public let validationStatus: LoadBalancerTlsCertificateDomainStatus?

        @inlinable
        public init(domainName: String? = nil, validationStatus: LoadBalancerTlsCertificateDomainStatus? = nil) {
            self.domainName = domainName
            self.validationStatus = validationStatus
        }

        private enum CodingKeys: String, CodingKey {
            case domainName = "domainName"
            case validationStatus = "validationStatus"
        }
    }

    public struct LoadBalancerTlsCertificateDomainValidationRecord: AWSDecodableShape {
        /// An object that describes the state of the canonical name (CNAME) records that are automatically added by Lightsail to the DNS of a domain to validate domain ownership.
        public let dnsRecordCreationState: LoadBalancerTlsCertificateDnsRecordCreationState?
        /// The domain name against which your SSL/TLS certificate was validated.
        public let domainName: String?
        /// A fully qualified domain name in the certificate. For example, example.com.
        public let name: String?
        /// The type of validation record. For example, CNAME for domain validation.
        public let type: String?
        /// The validation status. Valid values are listed below.
        public let validationStatus: LoadBalancerTlsCertificateDomainStatus?
        /// The value for that type.
        public let value: String?

        @inlinable
        public init(dnsRecordCreationState: LoadBalancerTlsCertificateDnsRecordCreationState? = nil, domainName: String? = nil, name: String? = nil, type: String? = nil, validationStatus: LoadBalancerTlsCertificateDomainStatus? = nil, value: String? = nil) {
            self.dnsRecordCreationState = dnsRecordCreationState
            self.domainName = domainName
            self.name = name
            self.type = type
            self.validationStatus = validationStatus
            self.value = value
        }

        private enum CodingKeys: String, CodingKey {
            case dnsRecordCreationState = "dnsRecordCreationState"
            case domainName = "domainName"
            case name = "name"
            case type = "type"
            case validationStatus = "validationStatus"
            case value = "value"
        }
    }

    public struct LoadBalancerTlsCertificateRenewalSummary: AWSDecodableShape {
        /// Contains information about the validation of each domain name in the certificate, as it pertains to Lightsail's managed renewal. This is different from the initial validation that occurs as a result of the RequestCertificate request.
        public let domainValidationOptions: [LoadBalancerTlsCertificateDomainValidationOption]?
        /// The renewal status of the certificate. The following renewal status are possible:     PendingAutoRenewal - Lightsail is attempting to automatically validate the domain names of the certificate. No further action is required.      PendingValidation - Lightsail couldn't automatically validate one or more domain names of the certificate. You must take action to validate these domain names or the certificate won't be renewed. Check to make sure your certificate's domain validation records exist in your domain's DNS, and that your certificate remains in use.     Success - All domain names in the certificate are validated, and Lightsail renewed the certificate. No further action is required.      Failed - One or more domain names were not validated before the certificate expired, and Lightsail did not renew the certificate. You can request a new certificate using the CreateCertificate action.
        public let renewalStatus: LoadBalancerTlsCertificateRenewalStatus?

        @inlinable
        public init(domainValidationOptions: [LoadBalancerTlsCertificateDomainValidationOption]? = nil, renewalStatus: LoadBalancerTlsCertificateRenewalStatus? = nil) {
            self.domainValidationOptions = domainValidationOptions
            self.renewalStatus = renewalStatus
        }

        private enum CodingKeys: String, CodingKey {
            case domainValidationOptions = "domainValidationOptions"
            case renewalStatus = "renewalStatus"
        }
    }

    public struct LoadBalancerTlsCertificateSummary: AWSDecodableShape {
        /// When true, the SSL/TLS certificate is attached to the Lightsail load balancer.
        public let isAttached: Bool?
        /// The name of the SSL/TLS certificate.
        public let name: String?

        @inlinable
        public init(isAttached: Bool? = nil, name: String? = nil) {
            self.isAttached = isAttached
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case isAttached = "isAttached"
            case name = "name"
        }
    }

    public struct LoadBalancerTlsPolicy: AWSDecodableShape {
        /// The ciphers used by the TLS security policy. The ciphers are listed in order of preference.
        public let ciphers: [String]?
        /// The description of the TLS security policy.
        public let description: String?
        /// A Boolean value that indicates whether the TLS security policy is the default.
        public let isDefault: Bool?
        /// The name of the TLS security policy.
        public let name: String?
        /// The protocols used in a given TLS security policy.
        public let protocols: [String]?

        @inlinable
        public init(ciphers: [String]? = nil, description: String? = nil, isDefault: Bool? = nil, name: String? = nil, protocols: [String]? = nil) {
            self.ciphers = ciphers
            self.description = description
            self.isDefault = isDefault
            self.name = name
            self.protocols = protocols
        }

        private enum CodingKeys: String, CodingKey {
            case ciphers = "ciphers"
            case description = "description"
            case isDefault = "isDefault"
            case name = "name"
            case protocols = "protocols"
        }
    }

    public struct LogEvent: AWSDecodableShape {
        /// The timestamp when the database log event was created.
        public let createdAt: Date?
        /// The message of the database log event.
        public let message: String?

        @inlinable
        public init(createdAt: Date? = nil, message: String? = nil) {
            self.createdAt = createdAt
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case createdAt = "createdAt"
            case message = "message"
        }
    }

    public struct MetricDatapoint: AWSDecodableShape {
        /// The average.
        public let average: Double?
        /// The maximum.
        public let maximum: Double?
        /// The minimum.
        public let minimum: Double?
        /// The sample count.
        public let sampleCount: Double?
        /// The sum.
        public let sum: Double?
        /// The timestamp (1479816991.349).
        public let timestamp: Date?
        /// The unit.
        public let unit: MetricUnit?

        @inlinable
        public init(average: Double? = nil, maximum: Double? = nil, minimum: Double? = nil, sampleCount: Double? = nil, sum: Double? = nil, timestamp: Date? = nil, unit: MetricUnit? = nil) {
            self.average = average
            self.maximum = maximum
            self.minimum = minimum
            self.sampleCount = sampleCount
            self.sum = sum
            self.timestamp = timestamp
            self.unit = unit
        }

        private enum CodingKeys: String, CodingKey {
            case average = "average"
            case maximum = "maximum"
            case minimum = "minimum"
            case sampleCount = "sampleCount"
            case sum = "sum"
            case timestamp = "timestamp"
            case unit = "unit"
        }
    }

    public struct MonitoredResourceInfo: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the resource being monitored.
        public let arn: String?
        /// The name of the Lightsail resource being monitored.
        public let name: String?
        /// The Lightsail resource type of the resource being monitored. Instances, load balancers, and relational databases are the only Lightsail resources that can currently be monitored by alarms.
        public let resourceType: ResourceType?

        @inlinable
        public init(arn: String? = nil, name: String? = nil, resourceType: ResourceType? = nil) {
            self.arn = arn
            self.name = name
            self.resourceType = resourceType
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "arn"
            case name = "name"
            case resourceType = "resourceType"
        }
    }

    public struct MonthlyTransfer: AWSDecodableShape {
        /// The amount allocated per month (in GB).
        public let gbPerMonthAllocated: Int?

        @inlinable
        public init(gbPerMonthAllocated: Int? = nil) {
            self.gbPerMonthAllocated = gbPerMonthAllocated
        }

        private enum CodingKeys: String, CodingKey {
            case gbPerMonthAllocated = "gbPerMonthAllocated"
        }
    }

    public struct NameServersUpdateState: AWSDecodableShape {
        /// The status code for the name servers update. Following are the possible values:    SUCCEEDED - The name server records were successfully updated.    PENDING - The name server record update is in progress.    FAILED - The name server record update failed.    STARTED - The automatic name server record update started.
        public let code: NameServersUpdateStateCode?
        /// The message that describes the reason for the status code.
        public let message: String?

        @inlinable
        public init(code: NameServersUpdateStateCode? = nil, message: String? = nil) {
            self.code = code
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "code"
            case message = "message"
        }
    }

    public struct NotFoundException: AWSErrorShape {
        public let code: String?
        public let docs: String?
        public let message: String?
        public let tip: String?

        @inlinable
        public init(code: String? = nil, docs: String? = nil, message: String? = nil, tip: String? = nil) {
            self.code = code
            self.docs = docs
            self.message = message
            self.tip = tip
        }

        private enum CodingKeys: String, CodingKey {
            case code = "code"
            case docs = "docs"
            case message = "message"
            case tip = "tip"
        }
    }

    public struct OpenInstancePublicPortsRequest: AWSEncodableShape {
        /// The name of the instance for which to open ports.
        public let instanceName: String
        /// An object to describe the ports to open for the specified instance.
        public let portInfo: PortInfo

        @inlinable
        public init(instanceName: String, portInfo: PortInfo) {
            self.instanceName = instanceName
            self.portInfo = portInfo
        }

        public func validate(name: String) throws {
            try self.validate(self.instanceName, name: "instanceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.portInfo.validate(name: "\(name).portInfo")
        }

        private enum CodingKeys: String, CodingKey {
            case instanceName = "instanceName"
            case portInfo = "portInfo"
        }
    }

    public struct OpenInstancePublicPortsResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operation: Operation?

        @inlinable
        public init(operation: Operation? = nil) {
            self.operation = operation
        }

        private enum CodingKeys: String, CodingKey {
            case operation = "operation"
        }
    }

    public struct Operation: AWSDecodableShape {
        /// The timestamp when the operation was initialized (1479816991.349).
        public let createdAt: Date?
        /// The error code.
        public let errorCode: String?
        /// The error details.
        public let errorDetails: String?
        /// The ID of the operation.
        public let id: String?
        /// A Boolean value indicating whether the operation is terminal.
        public let isTerminal: Bool?
        /// The Amazon Web Services Region and Availability Zone.
        public let location: ResourceLocation?
        /// Details about the operation (Debian-1GB-Ohio-1).
        public let operationDetails: String?
        /// The type of operation.
        public let operationType: OperationType?
        /// The resource name.
        public let resourceName: String?
        /// The resource type.
        public let resourceType: ResourceType?
        /// The status of the operation.
        public let status: OperationStatus?
        /// The timestamp when the status was changed (1479816991.349).
        public let statusChangedAt: Date?

        @inlinable
        public init(createdAt: Date? = nil, errorCode: String? = nil, errorDetails: String? = nil, id: String? = nil, isTerminal: Bool? = nil, location: ResourceLocation? = nil, operationDetails: String? = nil, operationType: OperationType? = nil, resourceName: String? = nil, resourceType: ResourceType? = nil, status: OperationStatus? = nil, statusChangedAt: Date? = nil) {
            self.createdAt = createdAt
            self.errorCode = errorCode
            self.errorDetails = errorDetails
            self.id = id
            self.isTerminal = isTerminal
            self.location = location
            self.operationDetails = operationDetails
            self.operationType = operationType
            self.resourceName = resourceName
            self.resourceType = resourceType
            self.status = status
            self.statusChangedAt = statusChangedAt
        }

        private enum CodingKeys: String, CodingKey {
            case createdAt = "createdAt"
            case errorCode = "errorCode"
            case errorDetails = "errorDetails"
            case id = "id"
            case isTerminal = "isTerminal"
            case location = "location"
            case operationDetails = "operationDetails"
            case operationType = "operationType"
            case resourceName = "resourceName"
            case resourceType = "resourceType"
            case status = "status"
            case statusChangedAt = "statusChangedAt"
        }
    }

    public struct OperationFailureException: AWSErrorShape {
        public let code: String?
        public let docs: String?
        public let message: String?
        public let tip: String?

        @inlinable
        public init(code: String? = nil, docs: String? = nil, message: String? = nil, tip: String? = nil) {
            self.code = code
            self.docs = docs
            self.message = message
            self.tip = tip
        }

        private enum CodingKeys: String, CodingKey {
            case code = "code"
            case docs = "docs"
            case message = "message"
            case tip = "tip"
        }
    }

    public struct Origin: AWSDecodableShape {
        /// The name of the origin resource.
        public let name: String?
        /// The protocol that your Amazon Lightsail distribution uses when establishing a connection with your origin to pull content.
        public let protocolPolicy: OriginProtocolPolicyEnum?
        /// The AWS Region name of the origin resource.
        public let regionName: RegionName?
        /// The resource type of the origin resource (Instance).
        public let resourceType: ResourceType?
        /// The amount of time, in seconds, that the distribution waits for a response after forwarding a request to the origin. The minimum timeout is 1 second, the maximum is 60 seconds, and the default (if you don't specify otherwise) is 30 seconds.
        public let responseTimeout: Int?

        @inlinable
        public init(name: String? = nil, protocolPolicy: OriginProtocolPolicyEnum? = nil, regionName: RegionName? = nil, resourceType: ResourceType? = nil, responseTimeout: Int? = nil) {
            self.name = name
            self.protocolPolicy = protocolPolicy
            self.regionName = regionName
            self.resourceType = resourceType
            self.responseTimeout = responseTimeout
        }

        private enum CodingKeys: String, CodingKey {
            case name = "name"
            case protocolPolicy = "protocolPolicy"
            case regionName = "regionName"
            case resourceType = "resourceType"
            case responseTimeout = "responseTimeout"
        }
    }

    public struct PasswordData: AWSDecodableShape {
        /// The encrypted password. Ciphertext will be an empty string if access to your new instance is not ready yet. When you create an instance, it can take up to 15 minutes for the instance to be ready.  If you use the default key pair (LightsailDefaultKeyPair), the decrypted password will be available in the password field. If you are using a custom key pair, you need to use your own means of decryption. If you change the Administrator password on the instance, Lightsail will continue to return the original ciphertext value. When accessing the instance using RDP, you need to manually enter the Administrator password after changing it from the default.
        public let ciphertext: String?
        /// The name of the key pair that you used when creating your instance. If no key pair name was specified when creating the instance, Lightsail uses the default key pair (LightsailDefaultKeyPair). If you are using a custom key pair, you need to use your own means of decrypting your password using the ciphertext. Lightsail creates the ciphertext by encrypting your password with the public key part of this key pair.
        public let keyPairName: String?

        @inlinable
        public init(ciphertext: String? = nil, keyPairName: String? = nil) {
            self.ciphertext = ciphertext
            self.keyPairName = keyPairName
        }

        private enum CodingKeys: String, CodingKey {
            case ciphertext = "ciphertext"
            case keyPairName = "keyPairName"
        }
    }

    public struct PeerVpcRequest: AWSEncodableShape {
        public init() {}
    }

    public struct PeerVpcResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operation: Operation?

        @inlinable
        public init(operation: Operation? = nil) {
            self.operation = operation
        }

        private enum CodingKeys: String, CodingKey {
            case operation = "operation"
        }
    }

    public struct PendingMaintenanceAction: AWSDecodableShape {
        /// The type of pending database maintenance action.
        public let action: String?
        /// The effective date of the pending database maintenance action.
        public let currentApplyDate: Date?
        /// Additional detail about the pending database maintenance action.
        public let description: String?

        @inlinable
        public init(action: String? = nil, currentApplyDate: Date? = nil, description: String? = nil) {
            self.action = action
            self.currentApplyDate = currentApplyDate
            self.description = description
        }

        private enum CodingKeys: String, CodingKey {
            case action = "action"
            case currentApplyDate = "currentApplyDate"
            case description = "description"
        }
    }

    public struct PendingModifiedRelationalDatabaseValues: AWSDecodableShape {
        /// A Boolean value indicating whether automated backup retention is enabled.
        public let backupRetentionEnabled: Bool?
        /// The database engine version.
        public let engineVersion: String?
        /// The password for the master user of the database.
        public let masterUserPassword: String?

        @inlinable
        public init(backupRetentionEnabled: Bool? = nil, engineVersion: String? = nil, masterUserPassword: String? = nil) {
            self.backupRetentionEnabled = backupRetentionEnabled
            self.engineVersion = engineVersion
            self.masterUserPassword = masterUserPassword
        }

        private enum CodingKeys: String, CodingKey {
            case backupRetentionEnabled = "backupRetentionEnabled"
            case engineVersion = "engineVersion"
            case masterUserPassword = "masterUserPassword"
        }
    }

    public struct PortInfo: AWSEncodableShape {
        /// An alias that defines access for a preconfigured range of IP addresses. The only alias currently supported is lightsail-connect, which allows IP addresses of the browser-based RDP/SSH client in the Lightsail console to connect to your instance.
        public let cidrListAliases: [String]?
        /// The IPv4 address, or range of IPv4 addresses (in CIDR notation) that are allowed to connect to an instance through the ports, and the protocol.  The ipv6Cidrs parameter lists the IPv6 addresses that are allowed to connect to an instance.  Examples:   To allow the IP address 192.0.2.44, specify 192.0.2.44 or 192.0.2.44/32.    To allow the IP addresses 192.0.2.0 to 192.0.2.255, specify 192.0.2.0/24.   For more information about CIDR block notation, see Classless Inter-Domain Routing on Wikipedia.
        public let cidrs: [String]?
        /// The first port in a range of open ports on an instance. Allowed ports:   TCP and UDP - 0 to 65535    ICMP - The ICMP type for IPv4 addresses. For example, specify 8 as the fromPort (ICMP type), and -1 as the toPort (ICMP code), to enable ICMP Ping. For more information, see Control Messages on Wikipedia.   ICMPv6 - The ICMP type for IPv6 addresses. For example, specify 128 as the fromPort (ICMPv6 type), and 0 as toPort (ICMPv6 code). For more information, see Internet Control Message Protocol for IPv6.
        public let fromPort: Int?
        /// The IPv6 address, or range of IPv6 addresses (in CIDR notation) that are allowed to connect to an instance through the ports, and the protocol. Only devices with an IPv6 address can connect to an instance through IPv6; otherwise, IPv4 should be used.  The cidrs parameter lists the IPv4 addresses that are allowed to connect to an instance.  For more information about CIDR block notation, see Classless Inter-Domain Routing on Wikipedia.
        public let ipv6Cidrs: [String]?
        /// The IP protocol name. The name can be one of the following:    tcp - Transmission Control Protocol (TCP) provides reliable, ordered, and error-checked delivery of streamed data between applications running on hosts communicating by an IP network. If you have an application that doesn't require reliable data stream service, use UDP instead.    all - All transport layer protocol types. For more general information, see Transport layer on Wikipedia.    udp - With User Datagram Protocol (UDP), computer applications can send messages (or datagrams) to other hosts on an Internet Protocol (IP) network. Prior communications are not required to set up transmission channels or data paths. Applications that don't require reliable data stream service can use UDP, which provides a connectionless datagram service that emphasizes reduced latency over reliability. If you do require reliable data stream service, use TCP instead.    icmp - Internet Control Message Protocol (ICMP) is used to send error messages and operational information indicating success or failure when communicating with an instance. For example, an error is indicated when an instance could not be reached. When you specify icmp as the protocol, you must specify the ICMP type using the fromPort parameter, and ICMP code using the toPort parameter.    icmp6 - Internet Control Message Protocol (ICMP) for IPv6. When you specify icmp6 as the protocol, you must specify the ICMP type using the fromPort parameter, and ICMP code using the toPort parameter.
        public let `protocol`: NetworkProtocol?
        /// The last port in a range of open ports on an instance. Allowed ports:   TCP and UDP - 0 to 65535    ICMP - The ICMP code for IPv4 addresses. For example, specify 8 as the fromPort (ICMP type), and -1 as the toPort (ICMP code), to enable ICMP Ping. For more information, see Control Messages on Wikipedia.   ICMPv6 - The ICMP code for IPv6 addresses. For example, specify 128 as the fromPort (ICMPv6 type), and 0 as toPort (ICMPv6 code). For more information, see Internet Control Message Protocol for IPv6.
        public let toPort: Int?

        @inlinable
        public init(cidrListAliases: [String]? = nil, cidrs: [String]? = nil, fromPort: Int? = nil, ipv6Cidrs: [String]? = nil, protocol: NetworkProtocol? = nil, toPort: Int? = nil) {
            self.cidrListAliases = cidrListAliases
            self.cidrs = cidrs
            self.fromPort = fromPort
            self.ipv6Cidrs = ipv6Cidrs
            self.`protocol` = `protocol`
            self.toPort = toPort
        }

        public func validate(name: String) throws {
            try self.validate(self.fromPort, name: "fromPort", parent: name, max: 65535)
            try self.validate(self.fromPort, name: "fromPort", parent: name, min: -1)
            try self.validate(self.toPort, name: "toPort", parent: name, max: 65535)
            try self.validate(self.toPort, name: "toPort", parent: name, min: -1)
        }

        private enum CodingKeys: String, CodingKey {
            case cidrListAliases = "cidrListAliases"
            case cidrs = "cidrs"
            case fromPort = "fromPort"
            case ipv6Cidrs = "ipv6Cidrs"
            case `protocol` = "protocol"
            case toPort = "toPort"
        }
    }

    public struct PrivateRegistryAccess: AWSDecodableShape {
        /// An object that describes the activation status of the role that you can use to grant a Lightsail container service access to Amazon ECR private repositories. If the role is activated, the Amazon Resource Name (ARN) of the role is also listed.
        public let ecrImagePullerRole: ContainerServiceECRImagePullerRole?

        @inlinable
        public init(ecrImagePullerRole: ContainerServiceECRImagePullerRole? = nil) {
            self.ecrImagePullerRole = ecrImagePullerRole
        }

        private enum CodingKeys: String, CodingKey {
            case ecrImagePullerRole = "ecrImagePullerRole"
        }
    }

    public struct PrivateRegistryAccessRequest: AWSEncodableShape {
        /// An object to describe a request to activate or deactivate the role that you can use to grant an Amazon Lightsail container service access to Amazon Elastic Container Registry (Amazon ECR) private repositories.
        public let ecrImagePullerRole: ContainerServiceECRImagePullerRoleRequest?

        @inlinable
        public init(ecrImagePullerRole: ContainerServiceECRImagePullerRoleRequest? = nil) {
            self.ecrImagePullerRole = ecrImagePullerRole
        }

        private enum CodingKeys: String, CodingKey {
            case ecrImagePullerRole = "ecrImagePullerRole"
        }
    }

    public struct PutAlarmRequest: AWSEncodableShape {
        /// The name for the alarm. Specify the name of an existing alarm to update, and overwrite the previous configuration of the alarm.
        public let alarmName: String
        /// The arithmetic operation to use when comparing the specified statistic to the threshold. The specified statistic value is used as the first operand.
        public let comparisonOperator: ComparisonOperator
        /// The contact protocols to use for the alarm, such as Email, SMS (text messaging), or both. A notification is sent via the specified contact protocol if notifications are enabled for the alarm, and when the alarm is triggered. A notification is not sent if a contact protocol is not specified, if the specified contact protocol is not configured in the Amazon Web Services Region, or if notifications are not enabled for the alarm using the notificationEnabled paramater. Use the CreateContactMethod action to configure a contact protocol in an Amazon Web Services Region.
        public let contactProtocols: [ContactProtocol]?
        /// The number of data points that must be not within the specified threshold to trigger the alarm. If you are setting an "M out of N" alarm, this value (datapointsToAlarm) is the M.
        public let datapointsToAlarm: Int?
        /// The number of most recent periods over which data is compared to the specified threshold. If you are setting an "M out of N" alarm, this value (evaluationPeriods) is the N. If you are setting an alarm that requires that a number of consecutive data points be breaching to trigger the alarm, this value specifies the rolling period of time in which data points are evaluated. Each evaluation period is five minutes long. For example, specify an evaluation period of 24 to evaluate a metric over a rolling period of two hours. You can specify a minimum valuation period of 1 (5 minutes), and a maximum evaluation period of 288 (24 hours).
        public let evaluationPeriods: Int
        /// The name of the metric to associate with the alarm. You can configure up to two alarms per metric. The following metrics are available for each resource type:    Instances: BurstCapacityPercentage, BurstCapacityTime, CPUUtilization, NetworkIn, NetworkOut, StatusCheckFailed, StatusCheckFailed_Instance, and StatusCheckFailed_System.    Load balancers: ClientTLSNegotiationErrorCount, HealthyHostCount, UnhealthyHostCount, HTTPCode_LB_4XX_Count, HTTPCode_LB_5XX_Count, HTTPCode_Instance_2XX_Count, HTTPCode_Instance_3XX_Count, HTTPCode_Instance_4XX_Count, HTTPCode_Instance_5XX_Count, InstanceResponseTime, RejectedConnectionCount, and RequestCount.    Relational databases: CPUUtilization, DatabaseConnections, DiskQueueDepth, FreeStorageSpace, NetworkReceiveThroughput, and NetworkTransmitThroughput.   For more information about these metrics, see Metrics available in Lightsail.
        public let metricName: MetricName
        /// The name of the Lightsail resource that will be monitored. Instances, load balancers, and relational databases are the only Lightsail resources that can currently be monitored by alarms.
        public let monitoredResourceName: String
        /// Indicates whether the alarm is enabled. Notifications are enabled by default if you don't specify this parameter.
        public let notificationEnabled: Bool?
        /// The alarm states that trigger a notification. An alarm has the following possible states:    ALARM - The metric is outside of the defined threshold.    INSUFFICIENT_DATA - The alarm has just started, the metric is not available, or not enough data is available for the metric to determine the alarm state.    OK - The metric is within the defined threshold.   When you specify a notification trigger, the ALARM state must be specified. The INSUFFICIENT_DATA and OK states can be specified in addition to the ALARM state.   If you specify OK as an alarm trigger, a notification is sent when the alarm switches from an ALARM or INSUFFICIENT_DATA alarm state to an OK state. This can be thought of as an all clear alarm notification.   If you specify INSUFFICIENT_DATA as the alarm trigger, a notification is sent when the alarm switches from an OK or ALARM alarm state to an INSUFFICIENT_DATA state.   The notification trigger defaults to ALARM if you don't specify this parameter.
        public let notificationTriggers: [AlarmState]?
        /// The value against which the specified statistic is compared.
        public let threshold: Double
        /// Sets how this alarm will handle missing data points. An alarm can treat missing data in the following ways:    breaching - Assume the missing data is not within the threshold. Missing data counts towards the number of times the metric is not within the threshold.    notBreaching - Assume the missing data is within the threshold. Missing data does not count towards the number of times the metric is not within the threshold.    ignore - Ignore the missing data. Maintains the current alarm state.    missing - Missing data is treated as missing.   If treatMissingData is not specified, the default behavior of missing is used.
        public let treatMissingData: TreatMissingData?

        @inlinable
        public init(alarmName: String, comparisonOperator: ComparisonOperator, contactProtocols: [ContactProtocol]? = nil, datapointsToAlarm: Int? = nil, evaluationPeriods: Int, metricName: MetricName, monitoredResourceName: String, notificationEnabled: Bool? = nil, notificationTriggers: [AlarmState]? = nil, threshold: Double, treatMissingData: TreatMissingData? = nil) {
            self.alarmName = alarmName
            self.comparisonOperator = comparisonOperator
            self.contactProtocols = contactProtocols
            self.datapointsToAlarm = datapointsToAlarm
            self.evaluationPeriods = evaluationPeriods
            self.metricName = metricName
            self.monitoredResourceName = monitoredResourceName
            self.notificationEnabled = notificationEnabled
            self.notificationTriggers = notificationTriggers
            self.threshold = threshold
            self.treatMissingData = treatMissingData
        }

        public func validate(name: String) throws {
            try self.validate(self.alarmName, name: "alarmName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.monitoredResourceName, name: "monitoredResourceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case alarmName = "alarmName"
            case comparisonOperator = "comparisonOperator"
            case contactProtocols = "contactProtocols"
            case datapointsToAlarm = "datapointsToAlarm"
            case evaluationPeriods = "evaluationPeriods"
            case metricName = "metricName"
            case monitoredResourceName = "monitoredResourceName"
            case notificationEnabled = "notificationEnabled"
            case notificationTriggers = "notificationTriggers"
            case threshold = "threshold"
            case treatMissingData = "treatMissingData"
        }
    }

    public struct PutAlarmResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct PutInstancePublicPortsRequest: AWSEncodableShape {
        /// The name of the instance for which to open ports.
        public let instanceName: String
        /// An array of objects to describe the ports to open for the specified instance.
        public let portInfos: [PortInfo]

        @inlinable
        public init(instanceName: String, portInfos: [PortInfo]) {
            self.instanceName = instanceName
            self.portInfos = portInfos
        }

        public func validate(name: String) throws {
            try self.validate(self.instanceName, name: "instanceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.portInfos.forEach {
                try $0.validate(name: "\(name).portInfos[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case instanceName = "instanceName"
            case portInfos = "portInfos"
        }
    }

    public struct PutInstancePublicPortsResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operation: Operation?

        @inlinable
        public init(operation: Operation? = nil) {
            self.operation = operation
        }

        private enum CodingKeys: String, CodingKey {
            case operation = "operation"
        }
    }

    public struct QueryStringObject: AWSEncodableShape & AWSDecodableShape {
        /// Indicates whether the distribution forwards and caches based on query strings.
        public let option: Bool?
        /// The specific query strings that the distribution forwards to the origin. Your distribution will cache content based on the specified query strings. If the option parameter is true, then your distribution forwards all query strings, regardless of what you specify using the queryStringsAllowList parameter.
        public let queryStringsAllowList: [String]?

        @inlinable
        public init(option: Bool? = nil, queryStringsAllowList: [String]? = nil) {
            self.option = option
            self.queryStringsAllowList = queryStringsAllowList
        }

        private enum CodingKeys: String, CodingKey {
            case option = "option"
            case queryStringsAllowList = "queryStringsAllowList"
        }
    }

    public struct R53HostedZoneDeletionState: AWSDecodableShape {
        /// The status code for the deletion state. Following are the possible values:    SUCCEEDED - The hosted zone was successfully deleted.    PENDING - The hosted zone deletion is in progress.    FAILED - The hosted zone deletion failed.    STARTED - The hosted zone deletion started.
        public let code: R53HostedZoneDeletionStateCode?
        /// The message that describes the reason for the status code.
        public let message: String?

        @inlinable
        public init(code: R53HostedZoneDeletionStateCode? = nil, message: String? = nil) {
            self.code = code
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "code"
            case message = "message"
        }
    }

    public struct RebootInstanceRequest: AWSEncodableShape {
        /// The name of the instance to reboot.
        public let instanceName: String

        @inlinable
        public init(instanceName: String) {
            self.instanceName = instanceName
        }

        public func validate(name: String) throws {
            try self.validate(self.instanceName, name: "instanceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case instanceName = "instanceName"
        }
    }

    public struct RebootInstanceResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct RebootRelationalDatabaseRequest: AWSEncodableShape {
        /// The name of your database to reboot.
        public let relationalDatabaseName: String

        @inlinable
        public init(relationalDatabaseName: String) {
            self.relationalDatabaseName = relationalDatabaseName
        }

        public func validate(name: String) throws {
            try self.validate(self.relationalDatabaseName, name: "relationalDatabaseName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case relationalDatabaseName = "relationalDatabaseName"
        }
    }

    public struct RebootRelationalDatabaseResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct Region: AWSDecodableShape {
        /// The Availability Zones. Follows the format us-east-2a (case-sensitive).
        public let availabilityZones: [AvailabilityZone]?
        /// The continent code (NA, meaning North America).
        public let continentCode: String?
        /// The description of the Amazon Web Services Region (This region is recommended to serve users in the eastern United States and eastern Canada).
        public let description: String?
        /// The display name (Ohio).
        public let displayName: String?
        /// The region name (us-east-2).
        public let name: RegionName?
        /// The Availability Zones for databases. Follows the format us-east-2a (case-sensitive).
        public let relationalDatabaseAvailabilityZones: [AvailabilityZone]?

        @inlinable
        public init(availabilityZones: [AvailabilityZone]? = nil, continentCode: String? = nil, description: String? = nil, displayName: String? = nil, name: RegionName? = nil, relationalDatabaseAvailabilityZones: [AvailabilityZone]? = nil) {
            self.availabilityZones = availabilityZones
            self.continentCode = continentCode
            self.description = description
            self.displayName = displayName
            self.name = name
            self.relationalDatabaseAvailabilityZones = relationalDatabaseAvailabilityZones
        }

        private enum CodingKeys: String, CodingKey {
            case availabilityZones = "availabilityZones"
            case continentCode = "continentCode"
            case description = "description"
            case displayName = "displayName"
            case name = "name"
            case relationalDatabaseAvailabilityZones = "relationalDatabaseAvailabilityZones"
        }
    }

    public struct RegisterContainerImageRequest: AWSEncodableShape {
        /// The digest of the container image to be registered.
        public let digest: String
        /// The label for the container image when it's registered to the container service. Use a descriptive label that you can use to track the different versions of your registered container images. Use the GetContainerImages action to return the container images registered to a Lightsail container service. The label is the  portion of the following image name example:    :container-service-1..1    If the name of your container service is mycontainerservice, and the label that you specify is mystaticwebsite, then the name of the registered container image will be :mycontainerservice.mystaticwebsite.1. The number at the end of these image name examples represents the version of the registered container image. If you push and register another container image to the same Lightsail container service, with the same label, then the version number for the new registered container image will be 2. If you push and register another container image, the version number will be 3, and so on.
        public let label: String
        /// The name of the container service for which to register a container image.
        public let serviceName: String

        @inlinable
        public init(digest: String, label: String, serviceName: String) {
            self.digest = digest
            self.label = label
            self.serviceName = serviceName
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            var container = encoder.container(keyedBy: CodingKeys.self)
            try container.encode(self.digest, forKey: .digest)
            try container.encode(self.label, forKey: .label)
            request.encodePath(self.serviceName, key: "serviceName")
        }

        public func validate(name: String) throws {
            try self.validate(self.label, name: "label", parent: name, max: 53)
            try self.validate(self.label, name: "label", parent: name, min: 1)
            try self.validate(self.label, name: "label", parent: name, pattern: "^[a-z0-9]{1,2}|[a-z0-9][a-z0-9-]+[a-z0-9]$")
            try self.validate(self.serviceName, name: "serviceName", parent: name, max: 63)
            try self.validate(self.serviceName, name: "serviceName", parent: name, min: 1)
            try self.validate(self.serviceName, name: "serviceName", parent: name, pattern: "^[a-z0-9]{1,2}|[a-z0-9][a-z0-9-]+[a-z0-9]$")
        }

        private enum CodingKeys: String, CodingKey {
            case digest = "digest"
            case label = "label"
        }
    }

    public struct RegisterContainerImageResult: AWSDecodableShape {
        /// An object that describes a container image that is registered to a Lightsail container service
        public let containerImage: ContainerImage?

        @inlinable
        public init(containerImage: ContainerImage? = nil) {
            self.containerImage = containerImage
        }

        private enum CodingKeys: String, CodingKey {
            case containerImage = "containerImage"
        }
    }

    public struct RegisteredDomainDelegationInfo: AWSDecodableShape {
        /// An object that describes the state of the name server records that are automatically added to the Route 53 domain by Lightsail.
        public let nameServersUpdateState: NameServersUpdateState?
        /// Describes the deletion state of an Amazon Route 53 hosted zone for a domain that is being automatically delegated to an Amazon Lightsail DNS zone.
        public let r53HostedZoneDeletionState: R53HostedZoneDeletionState?

        @inlinable
        public init(nameServersUpdateState: NameServersUpdateState? = nil, r53HostedZoneDeletionState: R53HostedZoneDeletionState? = nil) {
            self.nameServersUpdateState = nameServersUpdateState
            self.r53HostedZoneDeletionState = r53HostedZoneDeletionState
        }

        private enum CodingKeys: String, CodingKey {
            case nameServersUpdateState = "nameServersUpdateState"
            case r53HostedZoneDeletionState = "r53HostedZoneDeletionState"
        }
    }

    public struct RelationalDatabase: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the database.
        public let arn: String?
        /// A Boolean value indicating whether automated backup retention is enabled for the database.
        public let backupRetentionEnabled: Bool?
        /// The certificate associated with the database.
        public let caCertificateIdentifier: String?
        /// The timestamp when the database was created. Formatted in Unix time.
        public let createdAt: Date?
        /// The database software (for example, MySQL).
        public let engine: String?
        /// The database engine version (for example, 5.7.23).
        public let engineVersion: String?
        /// Describes the hardware of the database.
        public let hardware: RelationalDatabaseHardware?
        /// The latest point in time to which the database can be restored. Formatted in Unix time.
        public let latestRestorableTime: Date?
        /// The Region name and Availability Zone where the database is located.
        public let location: ResourceLocation?
        /// The name of the master database created when the Lightsail database resource is created.
        public let masterDatabaseName: String?
        /// The master endpoint for the database.
        public let masterEndpoint: RelationalDatabaseEndpoint?
        /// The master user name of the database.
        public let masterUsername: String?
        /// The unique name of the database resource in Lightsail.
        public let name: String?
        /// The status of parameter updates for the database.
        public let parameterApplyStatus: String?
        /// Describes the pending maintenance actions for the database.
        public let pendingMaintenanceActions: [PendingMaintenanceAction]?
        /// Describes pending database value modifications.
        public let pendingModifiedValues: PendingModifiedRelationalDatabaseValues?
        /// The daily time range during which automated backups are created for the database (for example, 16:00-16:30).
        public let preferredBackupWindow: String?
        /// The weekly time range during which system maintenance can occur on the database. In the format ddd:hh24:mi-ddd:hh24:mi. For example, Tue:17:00-Tue:17:30.
        public let preferredMaintenanceWindow: String?
        /// A Boolean value indicating whether the database is publicly accessible.
        public let publiclyAccessible: Bool?
        /// The blueprint ID for the database. A blueprint describes the major engine version of a database.
        public let relationalDatabaseBlueprintId: String?
        /// The bundle ID for the database. A bundle describes the performance specifications for your database.
        public let relationalDatabaseBundleId: String?
        /// The Lightsail resource type for the database (for example, RelationalDatabase).
        public let resourceType: ResourceType?
        /// Describes the secondary Availability Zone of a high availability database. The secondary database is used for failover support of a high availability database.
        public let secondaryAvailabilityZone: String?
        /// Describes the current state of the database.
        public let state: String?
        /// The support code for the database. Include this code in your email to support when you have questions about a database in Lightsail. This code enables our support team to look up your Lightsail information more easily.
        public let supportCode: String?
        /// The tag keys and optional values for the resource. For more information about tags in Lightsail, see the Amazon Lightsail Developer Guide.
        public let tags: [Tag]?

        @inlinable
        public init(arn: String? = nil, backupRetentionEnabled: Bool? = nil, caCertificateIdentifier: String? = nil, createdAt: Date? = nil, engine: String? = nil, engineVersion: String? = nil, hardware: RelationalDatabaseHardware? = nil, latestRestorableTime: Date? = nil, location: ResourceLocation? = nil, masterDatabaseName: String? = nil, masterEndpoint: RelationalDatabaseEndpoint? = nil, masterUsername: String? = nil, name: String? = nil, parameterApplyStatus: String? = nil, pendingMaintenanceActions: [PendingMaintenanceAction]? = nil, pendingModifiedValues: PendingModifiedRelationalDatabaseValues? = nil, preferredBackupWindow: String? = nil, preferredMaintenanceWindow: String? = nil, publiclyAccessible: Bool? = nil, relationalDatabaseBlueprintId: String? = nil, relationalDatabaseBundleId: String? = nil, resourceType: ResourceType? = nil, secondaryAvailabilityZone: String? = nil, state: String? = nil, supportCode: String? = nil, tags: [Tag]? = nil) {
            self.arn = arn
            self.backupRetentionEnabled = backupRetentionEnabled
            self.caCertificateIdentifier = caCertificateIdentifier
            self.createdAt = createdAt
            self.engine = engine
            self.engineVersion = engineVersion
            self.hardware = hardware
            self.latestRestorableTime = latestRestorableTime
            self.location = location
            self.masterDatabaseName = masterDatabaseName
            self.masterEndpoint = masterEndpoint
            self.masterUsername = masterUsername
            self.name = name
            self.parameterApplyStatus = parameterApplyStatus
            self.pendingMaintenanceActions = pendingMaintenanceActions
            self.pendingModifiedValues = pendingModifiedValues
            self.preferredBackupWindow = preferredBackupWindow
            self.preferredMaintenanceWindow = preferredMaintenanceWindow
            self.publiclyAccessible = publiclyAccessible
            self.relationalDatabaseBlueprintId = relationalDatabaseBlueprintId
            self.relationalDatabaseBundleId = relationalDatabaseBundleId
            self.resourceType = resourceType
            self.secondaryAvailabilityZone = secondaryAvailabilityZone
            self.state = state
            self.supportCode = supportCode
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "arn"
            case backupRetentionEnabled = "backupRetentionEnabled"
            case caCertificateIdentifier = "caCertificateIdentifier"
            case createdAt = "createdAt"
            case engine = "engine"
            case engineVersion = "engineVersion"
            case hardware = "hardware"
            case latestRestorableTime = "latestRestorableTime"
            case location = "location"
            case masterDatabaseName = "masterDatabaseName"
            case masterEndpoint = "masterEndpoint"
            case masterUsername = "masterUsername"
            case name = "name"
            case parameterApplyStatus = "parameterApplyStatus"
            case pendingMaintenanceActions = "pendingMaintenanceActions"
            case pendingModifiedValues = "pendingModifiedValues"
            case preferredBackupWindow = "preferredBackupWindow"
            case preferredMaintenanceWindow = "preferredMaintenanceWindow"
            case publiclyAccessible = "publiclyAccessible"
            case relationalDatabaseBlueprintId = "relationalDatabaseBlueprintId"
            case relationalDatabaseBundleId = "relationalDatabaseBundleId"
            case resourceType = "resourceType"
            case secondaryAvailabilityZone = "secondaryAvailabilityZone"
            case state = "state"
            case supportCode = "supportCode"
            case tags = "tags"
        }
    }

    public struct RelationalDatabaseBlueprint: AWSDecodableShape {
        /// The ID for the database blueprint.
        public let blueprintId: String?
        /// The database software of the database blueprint (for example, MySQL).
        public let engine: RelationalDatabaseEngine?
        /// The description of the database engine for the database blueprint.
        public let engineDescription: String?
        /// The database engine version for the database blueprint (for example, 5.7.23).
        public let engineVersion: String?
        /// The description of the database engine version for the database blueprint.
        public let engineVersionDescription: String?
        /// A Boolean value indicating whether the engine version is the default for the database blueprint.
        public let isEngineDefault: Bool?

        @inlinable
        public init(blueprintId: String? = nil, engine: RelationalDatabaseEngine? = nil, engineDescription: String? = nil, engineVersion: String? = nil, engineVersionDescription: String? = nil, isEngineDefault: Bool? = nil) {
            self.blueprintId = blueprintId
            self.engine = engine
            self.engineDescription = engineDescription
            self.engineVersion = engineVersion
            self.engineVersionDescription = engineVersionDescription
            self.isEngineDefault = isEngineDefault
        }

        private enum CodingKeys: String, CodingKey {
            case blueprintId = "blueprintId"
            case engine = "engine"
            case engineDescription = "engineDescription"
            case engineVersion = "engineVersion"
            case engineVersionDescription = "engineVersionDescription"
            case isEngineDefault = "isEngineDefault"
        }
    }

    public struct RelationalDatabaseBundle: AWSDecodableShape {
        /// The ID for the database bundle.
        public let bundleId: String?
        /// The number of virtual CPUs (vCPUs) for the database bundle.
        public let cpuCount: Int?
        /// The size of the disk for the database bundle.
        public let diskSizeInGb: Int?
        /// A Boolean value indicating whether the database bundle is active.
        public let isActive: Bool?
        /// A Boolean value indicating whether the database bundle is encrypted.
        public let isEncrypted: Bool?
        /// The name for the database bundle.
        public let name: String?
        /// The cost of the database bundle in US currency.
        public let price: Float?
        /// The amount of RAM in GB (for example, 2.0) for the database bundle.
        public let ramSizeInGb: Float?
        /// The data transfer rate per month in GB for the database bundle.
        public let transferPerMonthInGb: Int?

        @inlinable
        public init(bundleId: String? = nil, cpuCount: Int? = nil, diskSizeInGb: Int? = nil, isActive: Bool? = nil, isEncrypted: Bool? = nil, name: String? = nil, price: Float? = nil, ramSizeInGb: Float? = nil, transferPerMonthInGb: Int? = nil) {
            self.bundleId = bundleId
            self.cpuCount = cpuCount
            self.diskSizeInGb = diskSizeInGb
            self.isActive = isActive
            self.isEncrypted = isEncrypted
            self.name = name
            self.price = price
            self.ramSizeInGb = ramSizeInGb
            self.transferPerMonthInGb = transferPerMonthInGb
        }

        private enum CodingKeys: String, CodingKey {
            case bundleId = "bundleId"
            case cpuCount = "cpuCount"
            case diskSizeInGb = "diskSizeInGb"
            case isActive = "isActive"
            case isEncrypted = "isEncrypted"
            case name = "name"
            case price = "price"
            case ramSizeInGb = "ramSizeInGb"
            case transferPerMonthInGb = "transferPerMonthInGb"
        }
    }

    public struct RelationalDatabaseEndpoint: AWSDecodableShape {
        /// Specifies the DNS address of the database.
        public let address: String?
        /// Specifies the port that the database is listening on.
        public let port: Int?

        @inlinable
        public init(address: String? = nil, port: Int? = nil) {
            self.address = address
            self.port = port
        }

        private enum CodingKeys: String, CodingKey {
            case address = "address"
            case port = "port"
        }
    }

    public struct RelationalDatabaseEvent: AWSDecodableShape {
        /// The timestamp when the database event was created.
        public let createdAt: Date?
        /// The category that the database event belongs to.
        public let eventCategories: [String]?
        /// The message of the database event.
        public let message: String?
        /// The database that the database event relates to.
        public let resource: String?

        @inlinable
        public init(createdAt: Date? = nil, eventCategories: [String]? = nil, message: String? = nil, resource: String? = nil) {
            self.createdAt = createdAt
            self.eventCategories = eventCategories
            self.message = message
            self.resource = resource
        }

        private enum CodingKeys: String, CodingKey {
            case createdAt = "createdAt"
            case eventCategories = "eventCategories"
            case message = "message"
            case resource = "resource"
        }
    }

    public struct RelationalDatabaseHardware: AWSDecodableShape {
        /// The number of vCPUs for the database.
        public let cpuCount: Int?
        /// The size of the disk for the database.
        public let diskSizeInGb: Int?
        /// The amount of RAM in GB for the database.
        public let ramSizeInGb: Float?

        @inlinable
        public init(cpuCount: Int? = nil, diskSizeInGb: Int? = nil, ramSizeInGb: Float? = nil) {
            self.cpuCount = cpuCount
            self.diskSizeInGb = diskSizeInGb
            self.ramSizeInGb = ramSizeInGb
        }

        private enum CodingKeys: String, CodingKey {
            case cpuCount = "cpuCount"
            case diskSizeInGb = "diskSizeInGb"
            case ramSizeInGb = "ramSizeInGb"
        }
    }

    public struct RelationalDatabaseParameter: AWSEncodableShape & AWSDecodableShape {
        /// Specifies the valid range of values for the parameter.
        public let allowedValues: String?
        /// Indicates when parameter updates are applied. Can be immediate or pending-reboot.
        public let applyMethod: String?
        /// Specifies the engine-specific parameter type.
        public let applyType: String?
        /// Specifies the valid data type for the parameter.
        public let dataType: String?
        /// Provides a description of the parameter.
        public let description: String?
        /// A Boolean value indicating whether the parameter can be modified.
        public let isModifiable: Bool?
        /// Specifies the name of the parameter.
        public let parameterName: String?
        /// Specifies the value of the parameter.
        public let parameterValue: String?

        @inlinable
        public init(allowedValues: String? = nil, applyMethod: String? = nil, applyType: String? = nil, dataType: String? = nil, description: String? = nil, isModifiable: Bool? = nil, parameterName: String? = nil, parameterValue: String? = nil) {
            self.allowedValues = allowedValues
            self.applyMethod = applyMethod
            self.applyType = applyType
            self.dataType = dataType
            self.description = description
            self.isModifiable = isModifiable
            self.parameterName = parameterName
            self.parameterValue = parameterValue
        }

        private enum CodingKeys: String, CodingKey {
            case allowedValues = "allowedValues"
            case applyMethod = "applyMethod"
            case applyType = "applyType"
            case dataType = "dataType"
            case description = "description"
            case isModifiable = "isModifiable"
            case parameterName = "parameterName"
            case parameterValue = "parameterValue"
        }
    }

    public struct RelationalDatabaseSnapshot: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the database snapshot.
        public let arn: String?
        /// The timestamp when the database snapshot was created.
        public let createdAt: Date?
        /// The software of the database snapshot (for example, MySQL)
        public let engine: String?
        /// The database engine version for the database snapshot (for example, 5.7.23).
        public let engineVersion: String?
        /// The Amazon Resource Name (ARN) of the database from which the database snapshot was created.
        public let fromRelationalDatabaseArn: String?
        /// The blueprint ID of the database from which the database snapshot was created. A blueprint describes the major engine version of a database.
        public let fromRelationalDatabaseBlueprintId: String?
        /// The bundle ID of the database from which the database snapshot was created.
        public let fromRelationalDatabaseBundleId: String?
        /// The name of the source database from which the database snapshot was created.
        public let fromRelationalDatabaseName: String?
        /// The Region name and Availability Zone where the database snapshot is located.
        public let location: ResourceLocation?
        /// The name of the database snapshot.
        public let name: String?
        /// The Lightsail resource type.
        public let resourceType: ResourceType?
        /// The size of the disk in GB (for example, 32) for the database snapshot.
        public let sizeInGb: Int?
        /// The state of the database snapshot.
        public let state: String?
        /// The support code for the database snapshot. Include this code in your email to support when you have questions about a database snapshot in Lightsail. This code enables our support team to look up your Lightsail information more easily.
        public let supportCode: String?
        /// The tag keys and optional values for the resource. For more information about tags in Lightsail, see the Amazon Lightsail Developer Guide.
        public let tags: [Tag]?

        @inlinable
        public init(arn: String? = nil, createdAt: Date? = nil, engine: String? = nil, engineVersion: String? = nil, fromRelationalDatabaseArn: String? = nil, fromRelationalDatabaseBlueprintId: String? = nil, fromRelationalDatabaseBundleId: String? = nil, fromRelationalDatabaseName: String? = nil, location: ResourceLocation? = nil, name: String? = nil, resourceType: ResourceType? = nil, sizeInGb: Int? = nil, state: String? = nil, supportCode: String? = nil, tags: [Tag]? = nil) {
            self.arn = arn
            self.createdAt = createdAt
            self.engine = engine
            self.engineVersion = engineVersion
            self.fromRelationalDatabaseArn = fromRelationalDatabaseArn
            self.fromRelationalDatabaseBlueprintId = fromRelationalDatabaseBlueprintId
            self.fromRelationalDatabaseBundleId = fromRelationalDatabaseBundleId
            self.fromRelationalDatabaseName = fromRelationalDatabaseName
            self.location = location
            self.name = name
            self.resourceType = resourceType
            self.sizeInGb = sizeInGb
            self.state = state
            self.supportCode = supportCode
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "arn"
            case createdAt = "createdAt"
            case engine = "engine"
            case engineVersion = "engineVersion"
            case fromRelationalDatabaseArn = "fromRelationalDatabaseArn"
            case fromRelationalDatabaseBlueprintId = "fromRelationalDatabaseBlueprintId"
            case fromRelationalDatabaseBundleId = "fromRelationalDatabaseBundleId"
            case fromRelationalDatabaseName = "fromRelationalDatabaseName"
            case location = "location"
            case name = "name"
            case resourceType = "resourceType"
            case sizeInGb = "sizeInGb"
            case state = "state"
            case supportCode = "supportCode"
            case tags = "tags"
        }
    }

    public struct ReleaseStaticIpRequest: AWSEncodableShape {
        /// The name of the static IP to delete.
        public let staticIpName: String

        @inlinable
        public init(staticIpName: String) {
            self.staticIpName = staticIpName
        }

        public func validate(name: String) throws {
            try self.validate(self.staticIpName, name: "staticIpName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case staticIpName = "staticIpName"
        }
    }

    public struct ReleaseStaticIpResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct RenewalSummary: AWSDecodableShape {
        /// An array of objects that describe the domain validation records of the certificate.
        public let domainValidationRecords: [DomainValidationRecord]?
        /// The renewal status of the certificate. The following renewal status are possible:     PendingAutoRenewal - Lightsail is attempting to automatically validate the domain names of the certificate. No further action is required.      PendingValidation - Lightsail couldn't automatically validate one or more domain names of the certificate. You must take action to validate these domain names or the certificate won't be renewed. Check to make sure your certificate's domain validation records exist in your domain's DNS, and that your certificate remains in use.     Success - All domain names in the certificate are validated, and Lightsail renewed the certificate. No further action is required.      Failed - One or more domain names were not validated before the certificate expired, and Lightsail did not renew the certificate. You can request a new certificate using the CreateCertificate action.
        public let renewalStatus: RenewalStatus?
        /// The reason for the renewal status of the certificate.
        public let renewalStatusReason: String?
        /// The timestamp when the certificate was last updated.
        public let updatedAt: Date?

        @inlinable
        public init(domainValidationRecords: [DomainValidationRecord]? = nil, renewalStatus: RenewalStatus? = nil, renewalStatusReason: String? = nil, updatedAt: Date? = nil) {
            self.domainValidationRecords = domainValidationRecords
            self.renewalStatus = renewalStatus
            self.renewalStatusReason = renewalStatusReason
            self.updatedAt = updatedAt
        }

        private enum CodingKeys: String, CodingKey {
            case domainValidationRecords = "domainValidationRecords"
            case renewalStatus = "renewalStatus"
            case renewalStatusReason = "renewalStatusReason"
            case updatedAt = "updatedAt"
        }
    }

    public struct ResetDistributionCacheRequest: AWSEncodableShape {
        /// The name of the distribution for which to reset cache. Use the GetDistributions action to get a list of distribution names that you can specify.
        public let distributionName: String?

        @inlinable
        public init(distributionName: String? = nil) {
            self.distributionName = distributionName
        }

        public func validate(name: String) throws {
            try self.validate(self.distributionName, name: "distributionName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case distributionName = "distributionName"
        }
    }

    public struct ResetDistributionCacheResult: AWSDecodableShape {
        /// The timestamp of the reset cache request (1479734909.17) in Unix time format.
        public let createTime: Date?
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operation: Operation?
        /// The status of the reset cache request.
        public let status: String?

        @inlinable
        public init(createTime: Date? = nil, operation: Operation? = nil, status: String? = nil) {
            self.createTime = createTime
            self.operation = operation
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case createTime = "createTime"
            case operation = "operation"
            case status = "status"
        }
    }

    public struct ResourceBudgetEstimate: AWSDecodableShape {
        /// The cost estimate for the specified budget.
        public let costEstimates: [CostEstimate]?
        /// The estimate end time.
        public let endTime: Date?
        /// The resource name.
        public let resourceName: String?
        /// The type of resource the budget will track.
        public let resourceType: ResourceType?
        /// The estimate start time.
        public let startTime: Date?

        @inlinable
        public init(costEstimates: [CostEstimate]? = nil, endTime: Date? = nil, resourceName: String? = nil, resourceType: ResourceType? = nil, startTime: Date? = nil) {
            self.costEstimates = costEstimates
            self.endTime = endTime
            self.resourceName = resourceName
            self.resourceType = resourceType
            self.startTime = startTime
        }

        private enum CodingKeys: String, CodingKey {
            case costEstimates = "costEstimates"
            case endTime = "endTime"
            case resourceName = "resourceName"
            case resourceType = "resourceType"
            case startTime = "startTime"
        }
    }

    public struct ResourceLocation: AWSDecodableShape {
        /// The Availability Zone. Follows the format us-east-2a (case-sensitive).
        public let availabilityZone: String?
        /// The Amazon Web Services Region name.
        public let regionName: RegionName?

        @inlinable
        public init(availabilityZone: String? = nil, regionName: RegionName? = nil) {
            self.availabilityZone = availabilityZone
            self.regionName = regionName
        }

        private enum CodingKeys: String, CodingKey {
            case availabilityZone = "availabilityZone"
            case regionName = "regionName"
        }
    }

    public struct ResourceReceivingAccess: AWSDecodableShape {
        /// The name of the Lightsail instance.
        public let name: String?
        /// The Lightsail resource type (for example, Instance).
        public let resourceType: String?

        @inlinable
        public init(name: String? = nil, resourceType: String? = nil) {
            self.name = name
            self.resourceType = resourceType
        }

        private enum CodingKeys: String, CodingKey {
            case name = "name"
            case resourceType = "resourceType"
        }
    }

    public struct ResourceRecord: AWSDecodableShape {
        /// The name of the record.
        public let name: String?
        /// The DNS record type.
        public let type: String?
        /// The value for the DNS record.
        public let value: String?

        @inlinable
        public init(name: String? = nil, type: String? = nil, value: String? = nil) {
            self.name = name
            self.type = type
            self.value = value
        }

        private enum CodingKeys: String, CodingKey {
            case name = "name"
            case type = "type"
            case value = "value"
        }
    }

    public struct SendContactMethodVerificationRequest: AWSEncodableShape {
        /// The protocol to verify, such as Email or SMS (text messaging).
        public let `protocol`: ContactMethodVerificationProtocol

        @inlinable
        public init(protocol: ContactMethodVerificationProtocol) {
            self.`protocol` = `protocol`
        }

        private enum CodingKeys: String, CodingKey {
            case `protocol` = "protocol"
        }
    }

    public struct SendContactMethodVerificationResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct ServiceException: AWSErrorShape {
        public let code: String?
        public let docs: String?
        public let message: String?
        public let tip: String?

        @inlinable
        public init(code: String? = nil, docs: String? = nil, message: String? = nil, tip: String? = nil) {
            self.code = code
            self.docs = docs
            self.message = message
            self.tip = tip
        }

        private enum CodingKeys: String, CodingKey {
            case code = "code"
            case docs = "docs"
            case message = "message"
            case tip = "tip"
        }
    }

    public struct Session: AWSDecodableShape {
        /// When true, this Boolean value indicates the primary session for the specified resource.
        public let isPrimary: Bool?
        /// The session name.
        public let name: String?
        /// The session URL.
        public let url: String?

        @inlinable
        public init(isPrimary: Bool? = nil, name: String? = nil, url: String? = nil) {
            self.isPrimary = isPrimary
            self.name = name
            self.url = url
        }

        private enum CodingKeys: String, CodingKey {
            case isPrimary = "isPrimary"
            case name = "name"
            case url = "url"
        }
    }

    public struct SetIpAddressTypeRequest: AWSEncodableShape {
        /// Required parameter to accept the instance bundle update when changing to, and from, IPv6-only.  An instance bundle will change when switching from dual-stack or ipv4, to ipv6. It also changes when switching from ipv6, to dual-stack or ipv4. You must include this parameter in the command to update the bundle. For example, if you switch from dual-stack to ipv6, the bundle will be updated, and billing for the IPv6-only instance bundle begins immediately.
        public let acceptBundleUpdate: Bool?
        /// The IP address type to set for the specified resource. The possible values are ipv4 for IPv4 only, ipv6 for IPv6 only, and dualstack for IPv4 and IPv6.
        public let ipAddressType: IpAddressType
        /// The name of the resource for which to set the IP address type.
        public let resourceName: String
        /// The resource type. The resource values are Distribution, Instance, and LoadBalancer.  Distribution-related APIs are available only in the N. Virginia (us-east-1) Amazon Web Services Region. Set your Amazon Web Services Region configuration to us-east-1 to create, view, or edit distributions.
        public let resourceType: ResourceType

        @inlinable
        public init(acceptBundleUpdate: Bool? = nil, ipAddressType: IpAddressType, resourceName: String, resourceType: ResourceType) {
            self.acceptBundleUpdate = acceptBundleUpdate
            self.ipAddressType = ipAddressType
            self.resourceName = resourceName
            self.resourceType = resourceType
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceName, name: "resourceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case acceptBundleUpdate = "acceptBundleUpdate"
            case ipAddressType = "ipAddressType"
            case resourceName = "resourceName"
            case resourceType = "resourceType"
        }
    }

    public struct SetIpAddressTypeResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct SetResourceAccessForBucketRequest: AWSEncodableShape {
        /// The access setting. The following access settings are available:    allow - Allows access to the bucket and its objects.    deny - Denies access to the bucket and its objects. Use this setting to remove access for a resource previously set to allow.
        public let access: ResourceBucketAccess
        /// The name of the bucket for which to set access to another Lightsail resource.
        public let bucketName: String
        /// The name of the Lightsail instance for which to set bucket access. The instance must be in a running or stopped state.
        public let resourceName: String

        @inlinable
        public init(access: ResourceBucketAccess, bucketName: String, resourceName: String) {
            self.access = access
            self.bucketName = bucketName
            self.resourceName = resourceName
        }

        public func validate(name: String) throws {
            try self.validate(self.bucketName, name: "bucketName", parent: name, max: 54)
            try self.validate(self.bucketName, name: "bucketName", parent: name, min: 3)
            try self.validate(self.bucketName, name: "bucketName", parent: name, pattern: "^[a-z0-9][a-z0-9-]{1,52}[a-z0-9]$")
            try self.validate(self.resourceName, name: "resourceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case access = "access"
            case bucketName = "bucketName"
            case resourceName = "resourceName"
        }
    }

    public struct SetResourceAccessForBucketResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct SetupExecutionDetails: AWSDecodableShape {
        /// The command that was executed.
        public let command: String?
        /// The timestamp for when the request was run.
        public let dateTime: Date?
        /// The name of the target resource.
        public let name: String?
        /// The text written by the command to stderr.
        public let standardError: String?
        /// The text written by the command to stdout.
        public let standardOutput: String?
        /// The status of the SetupInstanceHttps request.
        public let status: SetupStatus?
        /// The current version of the script..
        public let version: String?

        @inlinable
        public init(command: String? = nil, dateTime: Date? = nil, name: String? = nil, standardError: String? = nil, standardOutput: String? = nil, status: SetupStatus? = nil, version: String? = nil) {
            self.command = command
            self.dateTime = dateTime
            self.name = name
            self.standardError = standardError
            self.standardOutput = standardOutput
            self.status = status
            self.version = version
        }

        private enum CodingKeys: String, CodingKey {
            case command = "command"
            case dateTime = "dateTime"
            case name = "name"
            case standardError = "standardError"
            case standardOutput = "standardOutput"
            case status = "status"
            case version = "version"
        }
    }

    public struct SetupHistory: AWSDecodableShape {
        /// Describes the full details of the request.
        public let executionDetails: [SetupExecutionDetails]?
        /// A GUID that's used to identify the operation.
        public let operationId: String?
        /// Information about the specified request.
        public let request: SetupRequest?
        /// The target resource name for the request.
        public let resource: SetupHistoryResource?
        /// The status of the request.
        public let status: SetupStatus?

        @inlinable
        public init(executionDetails: [SetupExecutionDetails]? = nil, operationId: String? = nil, request: SetupRequest? = nil, resource: SetupHistoryResource? = nil, status: SetupStatus? = nil) {
            self.executionDetails = executionDetails
            self.operationId = operationId
            self.request = request
            self.resource = resource
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case executionDetails = "executionDetails"
            case operationId = "operationId"
            case request = "request"
            case resource = "resource"
            case status = "status"
        }
    }

    public struct SetupHistoryResource: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the Lightsail resource.
        public let arn: String?
        /// The timestamp for when the resource was created.
        public let createdAt: Date?
        public let location: ResourceLocation?
        /// The name of the Lightsail resource.
        public let name: String?
        /// The Lightsail resource type. For example, Instance.
        public let resourceType: ResourceType?

        @inlinable
        public init(arn: String? = nil, createdAt: Date? = nil, location: ResourceLocation? = nil, name: String? = nil, resourceType: ResourceType? = nil) {
            self.arn = arn
            self.createdAt = createdAt
            self.location = location
            self.name = name
            self.resourceType = resourceType
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "arn"
            case createdAt = "createdAt"
            case location = "location"
            case name = "name"
            case resourceType = "resourceType"
        }
    }

    public struct SetupInstanceHttpsRequest: AWSEncodableShape {
        /// The certificate authority that issues the SSL/TLS certificate.
        public let certificateProvider: CertificateProvider
        /// The name of the domain and subdomains that were specified for the SSL/TLS certificate.
        public let domainNames: [String]
        /// The contact method for SSL/TLS certificate renewal alerts. You can enter one email address.
        public let emailAddress: String
        /// The name of the Lightsail instance.
        public let instanceName: String

        @inlinable
        public init(certificateProvider: CertificateProvider, domainNames: [String], emailAddress: String, instanceName: String) {
            self.certificateProvider = certificateProvider
            self.domainNames = domainNames
            self.emailAddress = emailAddress
            self.instanceName = instanceName
        }

        public func validate(name: String) throws {
            try self.domainNames.forEach {
                try validate($0, name: "domainNames[]", parent: name, max: 253)
                try validate($0, name: "domainNames[]", parent: name, min: 4)
                try validate($0, name: "domainNames[]", parent: name, pattern: "^[a-zA-Z0-9\\-]{1,63}(\\.[a-zA-Z0-9\\-]{1,63}){0,8}(\\.[a-zA-Z]{2,63})$")
            }
            try self.validate(self.domainNames, name: "domainNames", parent: name, max: 10)
            try self.validate(self.domainNames, name: "domainNames", parent: name, min: 1)
            try self.validate(self.emailAddress, name: "emailAddress", parent: name, max: 254)
            try self.validate(self.emailAddress, name: "emailAddress", parent: name, min: 6)
            try self.validate(self.emailAddress, name: "emailAddress", parent: name, pattern: "^[\\w!#$%&.'*+\\/=?^_\\x60{|}~\\-]{1,64}@[a-zA-Z0-9\\-]{1,63}(\\.[a-zA-Z0-9\\-]{1,63}){0,8}(\\.[a-zA-Z]{2,63})$")
            try self.validate(self.instanceName, name: "instanceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case certificateProvider = "certificateProvider"
            case domainNames = "domainNames"
            case emailAddress = "emailAddress"
            case instanceName = "instanceName"
        }
    }

    public struct SetupInstanceHttpsResult: AWSDecodableShape {
        /// The available API operations for SetupInstanceHttps.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct SetupRequest: AWSDecodableShape {
        /// The Certificate Authority (CA) that issues the SSL/TLS certificate.
        public let certificateProvider: CertificateProvider?
        /// The name of the domain and subdomains that the SSL/TLS certificate secures.
        public let domainNames: [String]?
        /// The name of the Lightsail instance.
        public let instanceName: String?

        @inlinable
        public init(certificateProvider: CertificateProvider? = nil, domainNames: [String]? = nil, instanceName: String? = nil) {
            self.certificateProvider = certificateProvider
            self.domainNames = domainNames
            self.instanceName = instanceName
        }

        private enum CodingKeys: String, CodingKey {
            case certificateProvider = "certificateProvider"
            case domainNames = "domainNames"
            case instanceName = "instanceName"
        }
    }

    public struct StartGUISessionRequest: AWSEncodableShape {
        /// The resource name.
        public let resourceName: String

        @inlinable
        public init(resourceName: String) {
            self.resourceName = resourceName
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceName, name: "resourceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case resourceName = "resourceName"
        }
    }

    public struct StartGUISessionResult: AWSDecodableShape {
        /// The available API operations.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct StartInstanceRequest: AWSEncodableShape {
        /// The name of the instance (a virtual private server) to start.
        public let instanceName: String

        @inlinable
        public init(instanceName: String) {
            self.instanceName = instanceName
        }

        public func validate(name: String) throws {
            try self.validate(self.instanceName, name: "instanceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case instanceName = "instanceName"
        }
    }

    public struct StartInstanceResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct StartRelationalDatabaseRequest: AWSEncodableShape {
        /// The name of your database to start.
        public let relationalDatabaseName: String

        @inlinable
        public init(relationalDatabaseName: String) {
            self.relationalDatabaseName = relationalDatabaseName
        }

        public func validate(name: String) throws {
            try self.validate(self.relationalDatabaseName, name: "relationalDatabaseName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case relationalDatabaseName = "relationalDatabaseName"
        }
    }

    public struct StartRelationalDatabaseResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct StaticIp: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the static IP (arn:aws:lightsail:us-east-2:123456789101:StaticIp/9cbb4a9e-f8e3-4dfe-b57e-12345EXAMPLE).
        public let arn: String?
        /// The instance where the static IP is attached (Amazon_Linux-1GB-Ohio-1).
        public let attachedTo: String?
        /// The timestamp when the static IP was created (1479735304.222).
        public let createdAt: Date?
        /// The static IP address.
        public let ipAddress: String?
        /// A Boolean value indicating whether the static IP is attached.
        public let isAttached: Bool?
        /// The region and Availability Zone where the static IP was created.
        public let location: ResourceLocation?
        /// The name of the static IP (StaticIP-Ohio-EXAMPLE).
        public let name: String?
        /// The resource type (usually StaticIp).
        public let resourceType: ResourceType?
        /// The support code. Include this code in your email to support when you have questions about an instance or another resource in Lightsail. This code enables our support team to look up your Lightsail information more easily.
        public let supportCode: String?

        @inlinable
        public init(arn: String? = nil, attachedTo: String? = nil, createdAt: Date? = nil, ipAddress: String? = nil, isAttached: Bool? = nil, location: ResourceLocation? = nil, name: String? = nil, resourceType: ResourceType? = nil, supportCode: String? = nil) {
            self.arn = arn
            self.attachedTo = attachedTo
            self.createdAt = createdAt
            self.ipAddress = ipAddress
            self.isAttached = isAttached
            self.location = location
            self.name = name
            self.resourceType = resourceType
            self.supportCode = supportCode
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "arn"
            case attachedTo = "attachedTo"
            case createdAt = "createdAt"
            case ipAddress = "ipAddress"
            case isAttached = "isAttached"
            case location = "location"
            case name = "name"
            case resourceType = "resourceType"
            case supportCode = "supportCode"
        }
    }

    public struct StopGUISessionRequest: AWSEncodableShape {
        /// The resource name.
        public let resourceName: String

        @inlinable
        public init(resourceName: String) {
            self.resourceName = resourceName
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceName, name: "resourceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case resourceName = "resourceName"
        }
    }

    public struct StopGUISessionResult: AWSDecodableShape {
        /// The available API operations.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct StopInstanceOnIdleRequest: AWSEncodableShape {
        /// The amount of idle time in minutes after which your virtual computer will automatically stop.
        public let duration: String?
        /// The value to compare with the duration.
        public let threshold: String?

        @inlinable
        public init(duration: String? = nil, threshold: String? = nil) {
            self.duration = duration
            self.threshold = threshold
        }

        private enum CodingKeys: String, CodingKey {
            case duration = "duration"
            case threshold = "threshold"
        }
    }

    public struct StopInstanceRequest: AWSEncodableShape {
        /// When set to True, forces a Lightsail instance that is stuck in a stopping state to stop.  Only use the force parameter if your instance is stuck in the stopping state. In any other state, your instance should stop normally without adding this parameter to your API request.
        public let force: Bool?
        /// The name of the instance (a virtual private server) to stop.
        public let instanceName: String

        @inlinable
        public init(force: Bool? = nil, instanceName: String) {
            self.force = force
            self.instanceName = instanceName
        }

        public func validate(name: String) throws {
            try self.validate(self.instanceName, name: "instanceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case force = "force"
            case instanceName = "instanceName"
        }
    }

    public struct StopInstanceResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct StopRelationalDatabaseRequest: AWSEncodableShape {
        /// The name of your database to stop.
        public let relationalDatabaseName: String
        /// The name of your new database snapshot to be created before stopping your database.
        public let relationalDatabaseSnapshotName: String?

        @inlinable
        public init(relationalDatabaseName: String, relationalDatabaseSnapshotName: String? = nil) {
            self.relationalDatabaseName = relationalDatabaseName
            self.relationalDatabaseSnapshotName = relationalDatabaseSnapshotName
        }

        public func validate(name: String) throws {
            try self.validate(self.relationalDatabaseName, name: "relationalDatabaseName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.relationalDatabaseSnapshotName, name: "relationalDatabaseSnapshotName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case relationalDatabaseName = "relationalDatabaseName"
            case relationalDatabaseSnapshotName = "relationalDatabaseSnapshotName"
        }
    }

    public struct StopRelationalDatabaseResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct Tag: AWSEncodableShape & AWSDecodableShape {
        /// The key of the tag. Constraints: Tag keys accept a maximum of 128 letters, numbers, spaces in UTF-8, or the following characters: + - = . _ : / @
        public let key: String?
        /// The value of the tag. Constraints: Tag values accept a maximum of 256 letters, numbers, spaces in UTF-8, or the following characters: + - = . _ : / @
        public let value: String?

        @inlinable
        public init(key: String? = nil, value: String? = nil) {
            self.key = key
            self.value = value
        }

        private enum CodingKeys: String, CodingKey {
            case key = "key"
            case value = "value"
        }
    }

    public struct TagResourceRequest: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the resource to which you want to add a tag.
        public let resourceArn: String?
        /// The name of the resource to which you are adding tags.
        public let resourceName: String
        /// The tag key and optional value.
        public let tags: [Tag]

        @inlinable
        public init(resourceArn: String? = nil, resourceName: String, tags: [Tag]) {
            self.resourceArn = resourceArn
            self.resourceName = resourceName
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, pattern: "^arn:(aws[^:]*):([a-zA-Z0-9-]+):([a-z0-9-]+):([0-9]+):([a-zA-Z]+)/([a-zA-Z0-9-]+)$")
            try self.validate(self.resourceName, name: "resourceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case resourceArn = "resourceArn"
            case resourceName = "resourceName"
            case tags = "tags"
        }
    }

    public struct TagResourceResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct TestAlarmRequest: AWSEncodableShape {
        /// The name of the alarm to test.
        public let alarmName: String
        /// The alarm state to test. An alarm has the following possible states that can be tested:    ALARM - The metric is outside of the defined threshold.    INSUFFICIENT_DATA - The alarm has just started, the metric is not available, or not enough data is available for the metric to determine the alarm state.    OK - The metric is within the defined threshold.
        public let state: AlarmState

        @inlinable
        public init(alarmName: String, state: AlarmState) {
            self.alarmName = alarmName
            self.state = state
        }

        public func validate(name: String) throws {
            try self.validate(self.alarmName, name: "alarmName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case alarmName = "alarmName"
            case state = "state"
        }
    }

    public struct TestAlarmResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct TimePeriod: AWSDecodableShape {
        /// The end of the time period. The end date is exclusive. For example, if end is 2017-05-01, Lightsail for Research retrieves cost and usage data from the start date up to, but not including, 2017-05-01.
        public let end: Date?
        /// The beginning of the time period. The start date is inclusive. For example, if start is 2017-01-01, Lightsail for Research retrieves cost and usage data starting at 2017-01-01 up to the end date. The start date must be equal to or no later than the current date to avoid a validation error.
        public let start: Date?

        @inlinable
        public init(end: Date? = nil, start: Date? = nil) {
            self.end = end
            self.start = start
        }

        private enum CodingKeys: String, CodingKey {
            case end = "end"
            case start = "start"
        }
    }

    public struct UnauthenticatedException: AWSErrorShape {
        public let code: String?
        public let docs: String?
        public let message: String?
        public let tip: String?

        @inlinable
        public init(code: String? = nil, docs: String? = nil, message: String? = nil, tip: String? = nil) {
            self.code = code
            self.docs = docs
            self.message = message
            self.tip = tip
        }

        private enum CodingKeys: String, CodingKey {
            case code = "code"
            case docs = "docs"
            case message = "message"
            case tip = "tip"
        }
    }

    public struct UnpeerVpcRequest: AWSEncodableShape {
        public init() {}
    }

    public struct UnpeerVpcResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operation: Operation?

        @inlinable
        public init(operation: Operation? = nil) {
            self.operation = operation
        }

        private enum CodingKeys: String, CodingKey {
            case operation = "operation"
        }
    }

    public struct UntagResourceRequest: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the resource from which you want to remove a tag.
        public let resourceArn: String?
        /// The name of the resource from which you are removing a tag.
        public let resourceName: String
        /// The tag keys to delete from the specified resource.
        public let tagKeys: [String]

        @inlinable
        public init(resourceArn: String? = nil, resourceName: String, tagKeys: [String]) {
            self.resourceArn = resourceArn
            self.resourceName = resourceName
            self.tagKeys = tagKeys
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, pattern: "^arn:(aws[^:]*):([a-zA-Z0-9-]+):([a-z0-9-]+):([0-9]+):([a-zA-Z]+)/([a-zA-Z0-9-]+)$")
            try self.validate(self.resourceName, name: "resourceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case resourceArn = "resourceArn"
            case resourceName = "resourceName"
            case tagKeys = "tagKeys"
        }
    }

    public struct UntagResourceResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct UpdateBucketBundleRequest: AWSEncodableShape {
        /// The name of the bucket for which to update the bundle.
        public let bucketName: String
        /// The ID of the new bundle to apply to the bucket. Use the GetBucketBundles action to get a list of bundle IDs that you can specify.
        public let bundleId: String

        @inlinable
        public init(bucketName: String, bundleId: String) {
            self.bucketName = bucketName
            self.bundleId = bundleId
        }

        public func validate(name: String) throws {
            try self.validate(self.bucketName, name: "bucketName", parent: name, max: 54)
            try self.validate(self.bucketName, name: "bucketName", parent: name, min: 3)
            try self.validate(self.bucketName, name: "bucketName", parent: name, pattern: "^[a-z0-9][a-z0-9-]{1,52}[a-z0-9]$")
            try self.validate(self.bundleId, name: "bundleId", parent: name, pattern: "\\S")
        }

        private enum CodingKeys: String, CodingKey {
            case bucketName = "bucketName"
            case bundleId = "bundleId"
        }
    }

    public struct UpdateBucketBundleResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct UpdateBucketRequest: AWSEncodableShape {
        /// An object that describes the access log configuration for the bucket.
        public let accessLogConfig: BucketAccessLogConfig?
        /// An object that sets the public accessibility of objects in the specified bucket.
        public let accessRules: AccessRules?
        /// The name of the bucket to update.
        public let bucketName: String
        /// An array of strings to specify the Amazon Web Services account IDs that can access the bucket. You can give a maximum of 10 Amazon Web Services accounts access to a bucket.
        public let readonlyAccessAccounts: [String]?
        /// Specifies whether to enable or suspend versioning of objects in the bucket. The following options can be specified:    Enabled - Enables versioning of objects in the specified bucket.    Suspended - Suspends versioning of objects in the specified bucket. Existing object versions are retained.
        public let versioning: String?

        @inlinable
        public init(accessLogConfig: BucketAccessLogConfig? = nil, accessRules: AccessRules? = nil, bucketName: String, readonlyAccessAccounts: [String]? = nil, versioning: String? = nil) {
            self.accessLogConfig = accessLogConfig
            self.accessRules = accessRules
            self.bucketName = bucketName
            self.readonlyAccessAccounts = readonlyAccessAccounts
            self.versioning = versioning
        }

        public func validate(name: String) throws {
            try self.accessLogConfig?.validate(name: "\(name).accessLogConfig")
            try self.validate(self.bucketName, name: "bucketName", parent: name, max: 54)
            try self.validate(self.bucketName, name: "bucketName", parent: name, min: 3)
            try self.validate(self.bucketName, name: "bucketName", parent: name, pattern: "^[a-z0-9][a-z0-9-]{1,52}[a-z0-9]$")
            try self.readonlyAccessAccounts?.forEach {
                try validate($0, name: "readonlyAccessAccounts[]", parent: name, pattern: "\\S")
            }
            try self.validate(self.readonlyAccessAccounts, name: "readonlyAccessAccounts", parent: name, max: 10)
            try self.validate(self.versioning, name: "versioning", parent: name, pattern: "\\S")
        }

        private enum CodingKeys: String, CodingKey {
            case accessLogConfig = "accessLogConfig"
            case accessRules = "accessRules"
            case bucketName = "bucketName"
            case readonlyAccessAccounts = "readonlyAccessAccounts"
            case versioning = "versioning"
        }
    }

    public struct UpdateBucketResult: AWSDecodableShape {
        /// An object that describes the bucket that is updated.
        public let bucket: Bucket?
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(bucket: Bucket? = nil, operations: [Operation]? = nil) {
            self.bucket = bucket
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case bucket = "bucket"
            case operations = "operations"
        }
    }

    public struct UpdateContainerServiceRequest: AWSEncodableShape {
        /// A Boolean value to indicate whether the container service is disabled.
        public let isDisabled: Bool?
        /// The power for the container service. The power specifies the amount of memory, vCPUs, and base monthly cost of each node of the container service. The power and scale of a container service makes up its configured capacity. To determine the monthly price of your container service, multiply the base price of the power with the scale (the number of nodes) of the service. Use the GetContainerServicePowers action to view the specifications of each power option.
        public let power: ContainerServicePowerName?
        /// An object to describe the configuration for the container service to access private container image repositories, such as Amazon Elastic Container Registry (Amazon ECR) private repositories. For more information, see Configuring access to an Amazon ECR private repository for an Amazon Lightsail container service in the Amazon Lightsail Developer Guide.
        public let privateRegistryAccess: PrivateRegistryAccessRequest?
        /// The public domain names to use with the container service, such as example.com and www.example.com. You can specify up to four public domain names for a container service. The domain names that you specify are used when you create a deployment with a container configured as the public endpoint of your container service. If you don't specify public domain names, then you can use the default domain of the container service.  You must create and validate an SSL/TLS certificate before you can use public domain names with your container service. Use the CreateCertificate action to create a certificate for the public domain names you want to use with your container service.  You can specify public domain names using a string to array map as shown in the example later on this page.
        public let publicDomainNames: [String: [String]]?
        /// The scale for the container service. The scale specifies the allocated compute nodes of the container service. The power and scale of a container service makes up its configured capacity. To determine the monthly price of your container service, multiply the base price of the power with the scale (the number of nodes) of the service.
        public let scale: Int?
        /// The name of the container service to update.
        public let serviceName: String

        @inlinable
        public init(isDisabled: Bool? = nil, power: ContainerServicePowerName? = nil, privateRegistryAccess: PrivateRegistryAccessRequest? = nil, publicDomainNames: [String: [String]]? = nil, scale: Int? = nil, serviceName: String) {
            self.isDisabled = isDisabled
            self.power = power
            self.privateRegistryAccess = privateRegistryAccess
            self.publicDomainNames = publicDomainNames
            self.scale = scale
            self.serviceName = serviceName
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            var container = encoder.container(keyedBy: CodingKeys.self)
            try container.encodeIfPresent(self.isDisabled, forKey: .isDisabled)
            try container.encodeIfPresent(self.power, forKey: .power)
            try container.encodeIfPresent(self.privateRegistryAccess, forKey: .privateRegistryAccess)
            try container.encodeIfPresent(self.publicDomainNames, forKey: .publicDomainNames)
            try container.encodeIfPresent(self.scale, forKey: .scale)
            request.encodePath(self.serviceName, key: "serviceName")
        }

        public func validate(name: String) throws {
            try self.validate(self.scale, name: "scale", parent: name, max: 20)
            try self.validate(self.scale, name: "scale", parent: name, min: 1)
            try self.validate(self.serviceName, name: "serviceName", parent: name, max: 63)
            try self.validate(self.serviceName, name: "serviceName", parent: name, min: 1)
            try self.validate(self.serviceName, name: "serviceName", parent: name, pattern: "^[a-z0-9]{1,2}|[a-z0-9][a-z0-9-]+[a-z0-9]$")
        }

        private enum CodingKeys: String, CodingKey {
            case isDisabled = "isDisabled"
            case power = "power"
            case privateRegistryAccess = "privateRegistryAccess"
            case publicDomainNames = "publicDomainNames"
            case scale = "scale"
        }
    }

    public struct UpdateContainerServiceResult: AWSDecodableShape {
        /// An object that describes a container service.
        public let containerService: ContainerService?

        @inlinable
        public init(containerService: ContainerService? = nil) {
            self.containerService = containerService
        }

        private enum CodingKeys: String, CodingKey {
            case containerService = "containerService"
        }
    }

    public struct UpdateDistributionBundleRequest: AWSEncodableShape {
        /// The bundle ID of the new bundle to apply to your distribution. Use the GetDistributionBundles action to get a list of distribution bundle IDs that you can specify.
        public let bundleId: String?
        /// The name of the distribution for which to update the bundle. Use the GetDistributions action to get a list of distribution names that you can specify.
        public let distributionName: String?

        @inlinable
        public init(bundleId: String? = nil, distributionName: String? = nil) {
            self.bundleId = bundleId
            self.distributionName = distributionName
        }

        public func validate(name: String) throws {
            try self.validate(self.distributionName, name: "distributionName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case bundleId = "bundleId"
            case distributionName = "distributionName"
        }
    }

    public struct UpdateDistributionBundleResult: AWSDecodableShape {
        /// An object that describes the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operation: Operation?

        @inlinable
        public init(operation: Operation? = nil) {
            self.operation = operation
        }

        private enum CodingKeys: String, CodingKey {
            case operation = "operation"
        }
    }

    public struct UpdateDistributionRequest: AWSEncodableShape {
        /// An array of objects that describe the per-path cache behavior for the distribution.
        public let cacheBehaviors: [CacheBehaviorPerPath]?
        /// An object that describes the cache behavior settings for the distribution.  The cacheBehaviorSettings specified in your UpdateDistributionRequest will replace your distribution's existing settings.
        public let cacheBehaviorSettings: CacheSettings?
        /// The name of the SSL/TLS certificate that you want to attach to the distribution. Only certificates with a status of ISSUED can be attached to a distribution. Use the GetCertificates action to get a list of certificate names that you can specify.
        public let certificateName: String?
        /// An object that describes the default cache behavior for the distribution.
        public let defaultCacheBehavior: CacheBehavior?
        /// The name of the distribution to update. Use the GetDistributions action to get a list of distribution names that you can specify.
        public let distributionName: String
        /// Indicates whether to enable the distribution.
        public let isEnabled: Bool?
        /// An object that describes the origin resource for the distribution, such as a Lightsail instance, bucket, or load balancer. The distribution pulls, caches, and serves content from the origin.
        public let origin: InputOrigin?
        /// Indicates whether the default SSL/TLS certificate is attached to the distribution. The default value is true. When true, the distribution uses the default domain name such as d111111abcdef8.cloudfront.net. Set this value to false to attach a new certificate to the distribution.
        public let useDefaultCertificate: Bool?
        /// Use this parameter to update the minimum TLS protocol version for the SSL/TLS certificate that's attached to the distribution.
        public let viewerMinimumTlsProtocolVersion: ViewerMinimumTlsProtocolVersionEnum?

        @inlinable
        public init(cacheBehaviors: [CacheBehaviorPerPath]? = nil, cacheBehaviorSettings: CacheSettings? = nil, certificateName: String? = nil, defaultCacheBehavior: CacheBehavior? = nil, distributionName: String, isEnabled: Bool? = nil, origin: InputOrigin? = nil, useDefaultCertificate: Bool? = nil, viewerMinimumTlsProtocolVersion: ViewerMinimumTlsProtocolVersionEnum? = nil) {
            self.cacheBehaviors = cacheBehaviors
            self.cacheBehaviorSettings = cacheBehaviorSettings
            self.certificateName = certificateName
            self.defaultCacheBehavior = defaultCacheBehavior
            self.distributionName = distributionName
            self.isEnabled = isEnabled
            self.origin = origin
            self.useDefaultCertificate = useDefaultCertificate
            self.viewerMinimumTlsProtocolVersion = viewerMinimumTlsProtocolVersion
        }

        public func validate(name: String) throws {
            try self.cacheBehaviorSettings?.validate(name: "\(name).cacheBehaviorSettings")
            try self.validate(self.certificateName, name: "certificateName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.validate(self.distributionName, name: "distributionName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
            try self.origin?.validate(name: "\(name).origin")
        }

        private enum CodingKeys: String, CodingKey {
            case cacheBehaviors = "cacheBehaviors"
            case cacheBehaviorSettings = "cacheBehaviorSettings"
            case certificateName = "certificateName"
            case defaultCacheBehavior = "defaultCacheBehavior"
            case distributionName = "distributionName"
            case isEnabled = "isEnabled"
            case origin = "origin"
            case useDefaultCertificate = "useDefaultCertificate"
            case viewerMinimumTlsProtocolVersion = "viewerMinimumTlsProtocolVersion"
        }
    }

    public struct UpdateDistributionResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operation: Operation?

        @inlinable
        public init(operation: Operation? = nil) {
            self.operation = operation
        }

        private enum CodingKeys: String, CodingKey {
            case operation = "operation"
        }
    }

    public struct UpdateDomainEntryRequest: AWSEncodableShape {
        /// An array of key-value pairs containing information about the domain entry.
        public let domainEntry: DomainEntry
        /// The name of the domain recordset to update.
        public let domainName: String

        @inlinable
        public init(domainEntry: DomainEntry, domainName: String) {
            self.domainEntry = domainEntry
            self.domainName = domainName
        }

        public func validate(name: String) throws {
            try self.domainEntry.validate(name: "\(name).domainEntry")
        }

        private enum CodingKeys: String, CodingKey {
            case domainEntry = "domainEntry"
            case domainName = "domainName"
        }
    }

    public struct UpdateDomainEntryResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct UpdateInstanceMetadataOptionsRequest: AWSEncodableShape {
        /// Enables or disables the HTTP metadata endpoint on your instances. If this parameter is not specified, the existing state is maintained. If you specify a value of disabled, you cannot access your instance metadata.
        public let httpEndpoint: HttpEndpoint?
        /// Enables or disables the IPv6 endpoint for the instance metadata service. This setting applies only when the HTTP metadata endpoint is enabled.  This parameter is available only for instances in the Europe (Stockholm) Amazon Web Services Region (eu-north-1).
        public let httpProtocolIpv6: HttpProtocolIpv6?
        /// The desired HTTP PUT response hop limit for instance metadata requests. A larger number means that the instance metadata requests can travel farther. If no parameter is specified, the existing state is maintained.
        public let httpPutResponseHopLimit: Int?
        /// The state of token usage for your instance metadata requests. If the parameter is not specified in the request, the default state is optional. If the state is optional, you can choose whether to retrieve instance metadata with a signed token header on your request. If you retrieve the IAM role credentials without a token, the version 1.0 role credentials are returned. If you retrieve the IAM role credentials by using a valid signed token, the version 2.0 role credentials are returned. If the state is required, you must send a signed token header with all instance metadata retrieval requests. In this state, retrieving the IAM role credential always returns the version 2.0 credentials. The version 1.0 credentials are not available.
        public let httpTokens: HttpTokens?
        /// The name of the instance for which to update metadata parameters.
        public let instanceName: String

        @inlinable
        public init(httpEndpoint: HttpEndpoint? = nil, httpProtocolIpv6: HttpProtocolIpv6? = nil, httpPutResponseHopLimit: Int? = nil, httpTokens: HttpTokens? = nil, instanceName: String) {
            self.httpEndpoint = httpEndpoint
            self.httpProtocolIpv6 = httpProtocolIpv6
            self.httpPutResponseHopLimit = httpPutResponseHopLimit
            self.httpTokens = httpTokens
            self.instanceName = instanceName
        }

        public func validate(name: String) throws {
            try self.validate(self.instanceName, name: "instanceName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case httpEndpoint = "httpEndpoint"
            case httpProtocolIpv6 = "httpProtocolIpv6"
            case httpPutResponseHopLimit = "httpPutResponseHopLimit"
            case httpTokens = "httpTokens"
            case instanceName = "instanceName"
        }
    }

    public struct UpdateInstanceMetadataOptionsResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operation: Operation?

        @inlinable
        public init(operation: Operation? = nil) {
            self.operation = operation
        }

        private enum CodingKeys: String, CodingKey {
            case operation = "operation"
        }
    }

    public struct UpdateLoadBalancerAttributeRequest: AWSEncodableShape {
        /// The name of the attribute you want to update.
        public let attributeName: LoadBalancerAttributeName
        /// The value that you want to specify for the attribute name. The following values are supported depending on what you specify for the attributeName request parameter:   If you specify HealthCheckPath for the attributeName request parameter, then the attributeValue request parameter must be the path to ping on the target (for example, /weather/us/wa/seattle).   If you specify SessionStickinessEnabled for the attributeName request parameter, then the attributeValue request parameter must be true to activate session stickiness or false to deactivate session stickiness.   If you specify SessionStickiness_LB_CookieDurationSeconds for the attributeName request parameter, then the attributeValue request parameter must be an interger that represents the cookie duration in seconds.   If you specify HttpsRedirectionEnabled for the attributeName request parameter, then the attributeValue request parameter must be true to activate HTTP to HTTPS redirection or false to deactivate HTTP to HTTPS redirection.   If you specify TlsPolicyName for the attributeName request parameter, then the attributeValue request parameter must be the name of the TLS policy. Use the GetLoadBalancerTlsPolicies action to get a list of TLS policy names that you can specify.
        public let attributeValue: String
        /// The name of the load balancer that you want to modify (my-load-balancer.
        public let loadBalancerName: String

        @inlinable
        public init(attributeName: LoadBalancerAttributeName, attributeValue: String, loadBalancerName: String) {
            self.attributeName = attributeName
            self.attributeValue = attributeValue
            self.loadBalancerName = loadBalancerName
        }

        public func validate(name: String) throws {
            try self.validate(self.attributeValue, name: "attributeValue", parent: name, max: 256)
            try self.validate(self.attributeValue, name: "attributeValue", parent: name, min: 1)
            try self.validate(self.loadBalancerName, name: "loadBalancerName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case attributeName = "attributeName"
            case attributeValue = "attributeValue"
            case loadBalancerName = "loadBalancerName"
        }
    }

    public struct UpdateLoadBalancerAttributeResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct UpdateRelationalDatabaseParametersRequest: AWSEncodableShape {
        /// The database parameters to update.
        public let parameters: [RelationalDatabaseParameter]
        /// The name of your database for which to update parameters.
        public let relationalDatabaseName: String

        @inlinable
        public init(parameters: [RelationalDatabaseParameter], relationalDatabaseName: String) {
            self.parameters = parameters
            self.relationalDatabaseName = relationalDatabaseName
        }

        public func validate(name: String) throws {
            try self.validate(self.relationalDatabaseName, name: "relationalDatabaseName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case parameters = "parameters"
            case relationalDatabaseName = "relationalDatabaseName"
        }
    }

    public struct UpdateRelationalDatabaseParametersResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }

    public struct UpdateRelationalDatabaseRequest: AWSEncodableShape {
        /// When true, applies changes immediately. When false, applies changes during the preferred maintenance window. Some changes may cause an outage. Default: false
        public let applyImmediately: Bool?
        /// Indicates the certificate that needs to be associated with the database.
        public let caCertificateIdentifier: String?
        /// When true, disables automated backup retention for your database. Disabling backup retention deletes all automated database backups. Before disabling this, you may want to create a snapshot of your database using the create relational database snapshot operation. Updates are applied during the next maintenance window because this can result in an outage.
        public let disableBackupRetention: Bool?
        /// When true, enables automated backup retention for your database. Updates are applied during the next maintenance window because this can result in an outage.
        public let enableBackupRetention: Bool?
        /// The password for the master user. The password can include any printable ASCII character except "/", """, or "@". MySQL  Constraints: Must contain from 8 to 41 characters.  PostgreSQL  Constraints: Must contain from 8 to 128 characters.
        public let masterUserPassword: String?
        /// The daily time range during which automated backups are created for your database if automated backups are enabled. Constraints:   Must be in the hh24:mi-hh24:mi format. Example: 16:00-16:30    Specified in Coordinated Universal Time (UTC).   Must not conflict with the preferred maintenance window.   Must be at least 30 minutes.
        public let preferredBackupWindow: String?
        /// The weekly time range during which system maintenance can occur on your database. The default is a 30-minute window selected at random from an 8-hour block of time for each Amazon Web Services Region, occurring on a random day of the week. Constraints:   Must be in the ddd:hh24:mi-ddd:hh24:mi format.   Valid days: Mon, Tue, Wed, Thu, Fri, Sat, Sun.   Must be at least 30 minutes.   Specified in Coordinated Universal Time (UTC).   Example: Tue:17:00-Tue:17:30
        public let preferredMaintenanceWindow: String?
        /// Specifies the accessibility options for your database. A value of true specifies a database that is available to resources outside of your Lightsail account. A value of false specifies a database that is available only to your Lightsail resources in the same region as your database.
        public let publiclyAccessible: Bool?
        /// This parameter is used to update the major version of the database. Enter the blueprintId for the major version that you want to update to. Use the GetRelationalDatabaseBlueprints action to get a list of available blueprint IDs.
        public let relationalDatabaseBlueprintId: String?
        /// The name of your Lightsail database resource to update.
        public let relationalDatabaseName: String
        /// When true, the master user password is changed to a new strong password generated by Lightsail. Use the get relational database master user password operation to get the new password.
        public let rotateMasterUserPassword: Bool?

        @inlinable
        public init(applyImmediately: Bool? = nil, caCertificateIdentifier: String? = nil, disableBackupRetention: Bool? = nil, enableBackupRetention: Bool? = nil, masterUserPassword: String? = nil, preferredBackupWindow: String? = nil, preferredMaintenanceWindow: String? = nil, publiclyAccessible: Bool? = nil, relationalDatabaseBlueprintId: String? = nil, relationalDatabaseName: String, rotateMasterUserPassword: Bool? = nil) {
            self.applyImmediately = applyImmediately
            self.caCertificateIdentifier = caCertificateIdentifier
            self.disableBackupRetention = disableBackupRetention
            self.enableBackupRetention = enableBackupRetention
            self.masterUserPassword = masterUserPassword
            self.preferredBackupWindow = preferredBackupWindow
            self.preferredMaintenanceWindow = preferredMaintenanceWindow
            self.publiclyAccessible = publiclyAccessible
            self.relationalDatabaseBlueprintId = relationalDatabaseBlueprintId
            self.relationalDatabaseName = relationalDatabaseName
            self.rotateMasterUserPassword = rotateMasterUserPassword
        }

        public func validate(name: String) throws {
            try self.validate(self.relationalDatabaseName, name: "relationalDatabaseName", parent: name, pattern: "^\\w[\\w\\-]*\\w$")
        }

        private enum CodingKeys: String, CodingKey {
            case applyImmediately = "applyImmediately"
            case caCertificateIdentifier = "caCertificateIdentifier"
            case disableBackupRetention = "disableBackupRetention"
            case enableBackupRetention = "enableBackupRetention"
            case masterUserPassword = "masterUserPassword"
            case preferredBackupWindow = "preferredBackupWindow"
            case preferredMaintenanceWindow = "preferredMaintenanceWindow"
            case publiclyAccessible = "publiclyAccessible"
            case relationalDatabaseBlueprintId = "relationalDatabaseBlueprintId"
            case relationalDatabaseName = "relationalDatabaseName"
            case rotateMasterUserPassword = "rotateMasterUserPassword"
        }
    }

    public struct UpdateRelationalDatabaseResult: AWSDecodableShape {
        /// An array of objects that describe the result of the action, such as the status of the request, the timestamp of the request, and the resources affected by the request.
        public let operations: [Operation]?

        @inlinable
        public init(operations: [Operation]? = nil) {
            self.operations = operations
        }

        private enum CodingKeys: String, CodingKey {
            case operations = "operations"
        }
    }
}

// MARK: - Errors

/// Error enum for Lightsail
public struct LightsailErrorType: AWSErrorType {
    enum Code: String {
        case accessDeniedException = "AccessDeniedException"
        case accountSetupInProgressException = "AccountSetupInProgressException"
        case invalidInputException = "InvalidInputException"
        case notFoundException = "NotFoundException"
        case operationFailureException = "OperationFailureException"
        case serviceException = "ServiceException"
        case unauthenticatedException = "UnauthenticatedException"
    }

    private let error: Code
    public let context: AWSErrorContext?

    /// initialize Lightsail
    public init?(errorCode: String, context: AWSErrorContext) {
        guard let error = Code(rawValue: errorCode) else { return nil }
        self.error = error
        self.context = context
    }

    internal init(_ error: Code) {
        self.error = error
        self.context = nil
    }

    /// return error code string
    public var errorCode: String { self.error.rawValue }

    /// Lightsail throws this exception when the user cannot be authenticated or uses invalid credentials to access a resource.
    public static var accessDeniedException: Self { .init(.accessDeniedException) }
    /// Lightsail throws this exception when an account is still in the setup in progress state.
    public static var accountSetupInProgressException: Self { .init(.accountSetupInProgressException) }
    /// Lightsail throws this exception when user input does not conform to the validation rules of an input field.  Domain and distribution APIs are only available in the N. Virginia (us-east-1) Amazon Web Services Region. Please set your Amazon Web Services Region configuration to us-east-1 to create, view, or edit these resources.
    public static var invalidInputException: Self { .init(.invalidInputException) }
    /// Lightsail throws this exception when it cannot find a resource.
    public static var notFoundException: Self { .init(.notFoundException) }
    /// Lightsail throws this exception when an operation fails to execute.
    public static var operationFailureException: Self { .init(.operationFailureException) }
    /// A general service exception.
    public static var serviceException: Self { .init(.serviceException) }
    /// Lightsail throws this exception when the user has not been authenticated.
    public static var unauthenticatedException: Self { .init(.unauthenticatedException) }
}

extension LightsailErrorType: AWSServiceErrorType {
    public static let errorCodeMap: [String: AWSErrorShape.Type] = [
        "AccessDeniedException": Lightsail.AccessDeniedException.self,
        "AccountSetupInProgressException": Lightsail.AccountSetupInProgressException.self,
        "InvalidInputException": Lightsail.InvalidInputException.self,
        "NotFoundException": Lightsail.NotFoundException.self,
        "OperationFailureException": Lightsail.OperationFailureException.self,
        "ServiceException": Lightsail.ServiceException.self,
        "UnauthenticatedException": Lightsail.UnauthenticatedException.self
    ]
}

extension LightsailErrorType: Equatable {
    public static func == (lhs: LightsailErrorType, rhs: LightsailErrorType) -> Bool {
        lhs.error == rhs.error
    }
}

extension LightsailErrorType: CustomStringConvertible {
    public var description: String {
        return "\(self.error.rawValue): \(self.message ?? "")"
    }
}
